2016-06-24 3 views
0

У меня есть кусок кода следующим образом:Javascript Регулярное выражение (х)

var str = "foo xxx eee dsds"; 
var regex = /(foo)/; 
console.log(str.match(regex)); 

Я ожидал, что выход:

Foo

Но фактический выход:

foo, foo

Если я объявить:

вар регулярное выражение =/(FOO)/г;

Выход только Foo

Может кто-нибудь мне помочь? Спасибо за помощь.

+4

'match' возвращает массив. Первый элемент массива - это _whole match_, а второй - вывод _captured_. В этом случае значения одинаковы. Вы хотите второй элемент массива. Проверьте https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/match#Examples – undefined

+1

, так почему/(foo)/g возвращает только foo? @Vohuman – ThiepLV

+0

Поскольку стандарт ES говорит так: http: //www.ecma-international.орг/ECMA-262/5,1/# втор-15.5.4.10. Используя глобальный флаг, метод 'match' возвращает другой вывод, массив согласованных значений. – undefined

ответ

3

Второе значение в массиве - это зафиксированное значение, в отсутствие глобальных модификаторов match результаты содержат зафиксированные значения. Если вы удалите группу захвата, результат будет содержать только совпадение.

var str = "foo xxx eee dsds"; 
 
console.log(str.match(/(foo)/)); 
 
console.log(str.match(/(foo)/g)); 
 
console.log(str.match(/foo/));

Проверить MDN documentation:

Если регулярное выражение не содержит флаг г, возвращает тот же результат, как RegExp.exec(). Возвращенный массив имеет дополнительное свойство ввода, которое содержит исходную строку, которая была проанализирована. Кроме того, он имеет свойство index, которое представляет нулевой индекс совпадения в строке.

Если регулярное выражение включает флаг g, метод возвращает массив, содержащий все согласованные подстроки, а не соответствующие объектам. Захваченные группы не возвращаются. Если совпадений не было, метод возвращает null.

+1

Спасибо, это точный ответ, который мне нужен – ThiepLV

+1

@ThiepLV: рад помочь вам :) –

1

Ваш выход представляет собой возвращаемое значение метода matchwhich is an array. Чтобы получить желаемый результат, используйте либо str.match(regex)[0] (целая строка), либо str.match(regex)[1] (захваченная подстрока, соответствующая (foo), которая в вашем случае такая же). Но это лучше, чтобы сохранить массив матч первого и проверить, если это null или нет (если строка не совпадает, то null и null[0] вызовет ошибку):

var match = str.match(regex); 
if(match) 
    console.log(match[0]); 
else 
    // do whatever you want when there's no match 
Смежные вопросы