Regex для извлечения подстроки, возвращая 2 результата по какой-либо причине
Мне нужно сделать много регулярных выражений в javascript, но у меня есть некоторые проблемы с синтаксисом, и я не могу найти окончательный ресурс на этом.. по какой-то причине, когда я это делаю:
var tesst = "afskfsd33j"
var test = tesst.match(/a(.*)j/);
alert (test)
показывает
"afskfsd33j, fskfsd33"
Я не уверен, почему он дает этот вывод исходной и сопоставленной строки, мне интересно, как я могу заставить ее просто дать совпадение (по существу извлекая часть, которую я хочу из исходной строки)
Спасибо за любой совет
Ответы
Ответ 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)