Подтвердить что ты не робот

Regex для извлечения подстроки, возвращая 2 результата по какой-либо причине

Мне нужно сделать много регулярных выражений в javascript, но у меня есть некоторые проблемы с синтаксисом, и я не могу найти окончательный ресурс на этом.. по какой-то причине, когда я это делаю:

var tesst = "afskfsd33j"
var test = tesst.match(/a(.*)j/);
alert (test)

показывает

"afskfsd33j, fskfsd33"

Я не уверен, почему он дает этот вывод исходной и сопоставленной строки, мне интересно, как я могу заставить ее просто дать совпадение (по существу извлекая часть, которую я хочу из исходной строки)

Спасибо за любой совет

4b9b3361

Ответ 1

match возвращает массив.

Строковое представление массива по умолчанию в JavaScript - это элементы массива, разделенные запятыми. В этом случае желаемый результат находится во втором элементе массива:

var tesst = "afskfsd33j"
var test = tesst.match(/a(.*)j/);
alert (test[1]);

Ответ 2

Я думаю, ваша проблема в том, что метод match возвращает массив. 0-й элемент в массиве является исходной строкой, 1-й-й-й позиции соответствуют 1-го и n-м совпадающим скобкам. В вашем вызове alert() отображается весь массив.

Ответ 3

Каждая группа, определенная в скобках(), фиксируется во время обработки, и каждый захваченный контент группы помещается в массив результатов в том же порядке, что и группы в шаблоне. Подробнее о http://www.regular-expressions.info/brackets.html и http://www.regular-expressions.info/refcapture.html (выберите правильный язык для просмотра поддерживаемых функций)

var source = "afskfsd33j"
var result = source.match(/a(.*)j/);

result: ["afskfsd33j", "fskfsd33"]

Причина, по которой вы получили этот точный результат, следующая:

Первое значение в массиве - это первая найденная строка, которая подтверждает весь шаблон. Поэтому он должен обязательно начинаться с "a", за которым следует любое количество символов, и заканчивается первым "j" char после запуска "a".

Второе значение в массиве - это захваченная группа, определенная скобками. В вашем случае группа содержит полное совпадение шаблона без содержимого, определенного вне скобки, так точно "fskfsd33".

Если вы хотите избавиться от второго значения в массиве, вы можете определить шаблон следующим образом:

/a(?:.*)j/

где "?:" означает, что группа символов, которые соответствуют содержимому в скобках, не будет частью результирующего массива.

Другие варианты могут быть в этом простом случае для записи шаблона без какой-либо группы, потому что нет необходимости использовать группу вообще:

/a.*j/

Если вы хотите просто проверить, соответствует ли исходный текст шаблону, и не волнует, какой текст он найдет, вы можете попробовать:

var result = /a.*j/.test(source);

Результат должен возвращать только значения true | false. Для получения дополнительной информации см. http://www.javascriptkit.com/javatutors/re3.shtml

Ответ 4

У меня была такая же проблема.

Вы получаете текст только дважды в своем результате, если вы включаете группу соответствия (в скобках) и модификатор 'g' (global). Первый элемент всегда является первым результатом, обычно OK при использовании match (reg) в короткой строке, однако при использовании такой конструкции, как:

while ((result = reg.exec(string)) !== null){
    console.log(result);
}

результаты немного отличаются.

Попробуйте использовать следующий код:

var regEx = new RegExp('([0-9]+ (cat|fish))','g'), sampleString="1 cat and 2 fish";
var result = sample_string.match(regEx);
console.log(JSON.stringify(result));
// ["1 cat","2 fish"]

var reg = new RegExp('[0-9]+ (cat|fish)','g'), sampleString="1 cat and 2 fish";
while ((result = reg.exec(sampleString)) !== null) {
    console.dir(JSON.stringify(result))
};
// '["1 cat","cat"]'
// '["2 fish","fish"]'

var reg = new RegExp('([0-9]+ (cat|fish))','g'), sampleString="1 cat and 2 fish";
while ((result = reg.exec(sampleString)) !== null){
    console.dir(JSON.stringify(result))
};
// '["1 cat","1 cat","cat"]'
// '["2 fish","2 fish","fish"]'

(проверено на последних версиях V8 - Chrome, Node.js)

Лучший ответ в настоящее время - комментарий, который я не могу выдвинуть, поэтому кредит на @Mic.

Ответ 5

Просто избавьтесь от скобок, и это даст вам массив с одним элементом и:

  • Изменить эту строку

var test = tesst.match(/a (. *) j/);

  • К этому

var test = tesst.match(/a.*j/);

Если вы добавите круглые скобки, функция match() найдет для вас два совпадения, одно для всего выражения и одно для выражения внутри скобки

  • Также в соответствии с документами developer.mozilla.org:

Если вы хотите только первое найденное совпадение, вы можете использовать Вместо этого RegExp.exec().

Вы можете использовать следующий код:

RegExp (/a.*j/). Exec ( "afskfsd33j")

Ответ 6

попробуйте это, верните только первый результат

var tesst = "afskfsd33j"
var test = tesst.match(/a(.*)j/g);
alert (test)