2014-12-04 6 views
1

Я не уверен, что это ошибка или просто я, которая не понимает поведение методов регулярного выражения javascript (последнее, вероятно, более вероятно).javascript regex match/exec issue

Проблема в том, что я не могу получить regexp's типа/(что-то | что-то)/для работы с методами match или exec без глобального идентификатора, например./(somereg1 | somereg2)/g

Когда существует глобальный идентификатор, методы корректно возвращают каждый найденный экземпляр. Но когда его нет, оба метода правильно возвращают только первое совпадение, которое они находят. Проблема в том, что они возвращают его дважды !? например, в предложении:

var str = "Here is somereg1 and somereg2" //I would expect 
str.match(/(somereg1|somereg2)/) 

вернуть "somereg1" Вместо этого он возвращает "somereg1, somereg1"

Установите этот флажок jsfiddle: http://jsfiddle.net/myf43ay1/

Код должен быть достаточно понятны. Первый пример сделан для W3schools.

Если у вас есть вопросы, пожалуйста, дайте мне знать.

\ Peter

+0

Первый элемент в массиве матч полный матч по регулярному выражению. Второй элемент вперед вы получаете все захваченные группы. – anubhava

ответ

1

Первый элемент является полным матчем регулярного выражения. Если вы попробуете это:

var str = "Here is somereg1 and somereg2" //I would expect 
str.match(/.*(somereg1|somereg2)/) 

Ваш результат будет ["Here is somereg1 and somereg2", "somereg2"].

То же самое происходит с методом .exec(str).

Возможно, вы захотите прочитать о .match и .exec.

EDIT: О «скобках вспомогательных скобок», в регулярных выражениях, круглых скобках delimit capture groups. Так что, если у вас это регулярное выражение:

/.*(somereg1).*?(somereg2)/ 

Ваш .match результат будет ["Here is somereg1 and somereg2", "somereg1", "somereg2"]. Итак, как вы можете видеть, массив результатов состоит из полного соответствия, за которым следуют все совпадения групп захвата.

И заставить группу не быть захваченным, просто разграничить с (?: и ):

"Here is somereg1 and somereg2".match(/.*(?:somereg1).*?(somereg2)/); 
// Will result in ["Here is somereg1 and somereg2", "somereg2"] 

Примечание: В JavaScript, захват группы не будут работать с глобальными (/g) регулярных выражений.

+0

приятный со ссылками! Я понимаю, почему они ведут себя так. Хотя я не понимаю, почему он разработан таким образом, чтобы возвращать матчи sub.parentheses? – PNS

+0

Я отредактировал свой ответ. –

+0

Теперь это имеет смысл. Приятно знать, как заставить это не включать эти подгруппы. Мне просто интересно об этом. – PNS

0

Для получения запроса вы можете использовать следующее. результат:

var str = "Here is somereg1 and somereg2" //I would expect 
str.match(/(?=(somereg1|somereg2))/) 

Что касается соответствия и исполнения. Я бы сказал, пойти на матч, поскольку он использует объект regex и предотвращает двойной переход и все для строк, используемых как re.

1

Измените вторую линию, как показано ниже:

str.match(/somereg1|somereg2/) 
+0

Результат будет Array ["somereg1"] –

+0

Madhura Это на самом деле именно то, что я ищу! Но единственная причина, по которой я понимаю, почему объясняется Данило. Но спасибо, что я буду использовать это. – PNS