регулярное выражение "/ ^ что-то /" поведение - PullRequest
0 голосов
/ 04 февраля 2010

В некоторых непонятных ситуациях регулярное выражение, такое как «/ ^ match /», работает точно противоположным образом, сопоставляя строку с «чем-то другим», и единственный способ исправить это - поместить все регулярное выражение в фигурные скобки. . "/ ^ (match) /", почему это происходит?

Ответы [ 2 ]

2 голосов
/ 04 февраля 2010

Просто дикая догадка ... единственный пример, который я могу придумать, - это поведение, которое вы описываете, меняется:

/^foo|bar/

до

/^(foo|bar)/

Обратите внимание, что добавление скобок меняет значение этого регулярного выражения. Второй соответствует foo или bar в начале строки. Первый соответствует foo в начале строки или в строке в любом месте в строке. Это может дать некоторые ложные совпадения, как вы описали.

Это простая ошибка - забыть эти скобки ... Я тоже делал это иногда ... краснеть ...;)

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

0 голосов
/ 04 февраля 2010

Полностью случайное предположение, но использовали ли вы его в split?

В javascript (я не так уверен в PHP), если я наберу это:

"matchabc".split(/^match/)

Я получаю:

["", "abc"]

Обратите внимание, что split использует совпадение для разделения строки, поэтому вы получаете фрагменты, которые не совпадают.

Однако, если я сделаю это:

"matchabc".split(/^(match)/)

Я получаю:

["", "match", "abc"]

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

...