Как вы используете не захваченные элементы в регулярном выражении Javascript? - PullRequest
3 голосов
/ 18 августа 2010

Я хочу захватить thing в nothing глобально и без учета регистра.

По некоторым причинам это не работает:

"Nothing thing nothing".match(/no(thing)/gi);

jsFiddle

Захваченный массив равен Nothing,nothing вместо thing,thing.

Я думал круглые скобки ограничивают соответствующий шаблон ?Что я делаю неправильно?

( да, я знаю, это также будет соответствовать nothingness)

Ответы [ 3 ]

5 голосов
/ 18 августа 2010

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

Чтобы получить все группы из каждого матча, выполните цикл:

var match;
while(match = /no(thing)/gi.exec("Nothing thing nothing")) 
{ 
  // Do something with match
}

Это даст вам ["Nothing", "thing"] и ["nothing", "thing"].

1 голос
/ 18 августа 2010

Скобки или нет, вся совпадающая подстрока всегда захватывается - думайте о ней как о группе захвата по умолчанию. Явные группы захвата позволяют вам работать с небольшими кусками текста в пределах общего соответствия.

В учебнике, на который вы ссылаетесь, действительно перечислены конструкции группировки под заголовком "разделители шаблонов", но это неверно, и фактическое описание не намного лучше:

(pattern), (?:pattern) Соответствует всему содержащемуся шаблону.

Ну, конечно, они будут соответствовать (или попытаться)! Но то, что круглые скобки делают, обрабатывает весь содержащийся sub шаблон как единое целое, поэтому вы можете (например) добавить к нему квантификатор:

(?:foo){3}  // "foofoofoo"

(?:...) - это чисто группирующая конструкция, в то время как (...) также захватывает все совпадения вложенного подшаблона.

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

0 голосов
/ 18 августа 2010

Скобки ничего не делают в этом регулярном выражении.

Регулярное выражение /no(thing)/gi совпадает с /nothing/gi.

Круглые скобки используются для группировки. Если вы не указали ссылки на группы (используя $ 1, $ 2) или не сосчитали группу, то () бесполезны.

Итак, это регулярное выражение найдет только эту последовательность n-o-t-h-i-n-g. Слово thing не начинается с «нет», поэтому оно не совпадает.


EDIT:

Измените на /(no)?thing/gi и будет работать. Будет работать потому что ()? обозначает необязательную деталь.

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