match () возвращает массив с двумя совпадениями, когда я ожидаю одно совпадение - PullRequest
16 голосов
/ 25 января 2012

Рассмотрим следующий пример:

<html>
<body>

<script type="text/javascript">

var str="filename.jpg";

var pattOne = new RegExp('\.[^\.]*$');
var pattTwo = new RegExp('(\.[^\.]*$)');
var pattThree = new RegExp('(\.[^\.]*$)', 'g');

document.write(str.match(pattOne));
document.write('<br>');
document.write(str.match(pattTwo));
document.write('<br>');
document.write(str.match(pattThree));

</script>
</body>
</html>

Вот результат:

.jpg
.jpg,.jpg
.jpg

Я ожидаю этот результат:

.jpg
.jpg
.jpg

Зачем ставить круглые скобки вокругрегулярное выражение меняет результат?Почему использование модификатора 'g' снова меняет результат?

Ответы [ 2 ]

27 голосов
/ 25 января 2012

С String.prototype.match [MDN] :

Если регулярное выражение не включает флаг g, возвращает тот же результат, что и regexp.exec(string).

Где документация RegExp.prototype.exec [MDN] говорит:

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

Итак, когда вы ввелигруппа перехвата во втором выражении, первый элемент - это полное совпадение, а второй - содержимое группы перехвата, которая, в вашем примере, также является полным совпадением.
В первом выражении нет группы перехвата, поэтому вы получите только совпадение.

Вернуться к документации match:

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

С модификатором g возвращаются только совпадения, но не содержимое групп захвата.В вашей строке есть только одно совпадение.

8 голосов
/ 25 января 2012

Функция .match() возвращает массив. document.write() печатает массив в виде строки.

Когда вы захватываете группу в строке, она создает массив следующим образом:

Array(
  [0] => 'the complete matched string',
  [1] => 'the first captured group',
  [2] => 'the second captured group', 
  [.] => '...'
)

Итак, с вашим регулярным выражением становится:

Array(
  [0] => '.jpg', // You match .jpg of the string
  [1] => '.jpg' // You captured the .jpg match
)

И если вы печатаете массив, он помещает , между значениями.

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