Regex для извлечения подстроки, возвращающей 2 результата по некоторым причинам - PullRequest
49 голосов
/ 15 августа 2010

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

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

показывает

"afskfsd33j, fskfsd33"

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

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

Ответы [ 4 ]

87 голосов
/ 15 августа 2010

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

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

var tesst = "afskfsd33j"
var test = tesst.match(/a(.*)j/);
alert (test[1]);
5 голосов
/ 15 августа 2010

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

4 голосов
/ 30 января 2015

Каждая группа, определенная в круглых скобках (), захватывается во время обработки, и каждое захваченное содержимое группы помещается в массив результатов в том же порядке, что и группы в начале шаблона. Подробнее см. 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» после начала «a».

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

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

/a(?:.*)j/

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

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

/a.*j/

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

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

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

3 голосов
/ 22 августа 2014

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

Вы получите текст в вашем результате только дважды, если вы включите группу совпадений (в скобках) и модификатор 'g' (глобальный).Первый элемент всегда является первым результатом, обычно в порядке при использовании 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...