поведение регулярного выражения «/^something/»
Вопрос
В некоторых непонятных ситуациях регулярное выражение типа «/^match/» работает совершенно противоположным образом, сопоставляя строку, которая является «чем-то другим», и единственный способ исправить это — поместить все регулярное выражение в фигурные скобки..."/^(match)/", почему это происходит?
Решение
Здесь просто дикая догадка...единственный пример, который я могу придумать, может привести к изменению поведения, которое вы описываете:
/^foo|bar/
к
/^(foo|bar)/
Обратите внимание, что добавление круглых скобок меняет смысл этого регулярного выражения.Второй соответствует foo или bar в начале строки.Первое соответствует foo в начале строки или такта. в любом месте в строке.Это может дать некоторые ложные совпадения, как вы описали.
Очень легко забыть эти скобки...Я тоже иногда это делала...краснею...;)
Я не могу сейчас вспомнить других примеров, но уверен, что могут быть и другие случаи, когда добавление круглых скобок приводит к небольшому изменению смысла.В следующий раз не забудьте сохранить найденный пример и опубликовать его здесь, чтобы мы могли его увидеть.
Другие советы
Совершенно случайное предположение, но использовали ли вы его в split
?
В javascript (я не уверен насчет PHP), если я наберу это:
"matchabc".split(/^match/)
Я получил:
["", "abc"]
Обратите внимание, что функция Split использует совпадение для разделения строки, поэтому вы получаете несовпадающие части.
Однако, если я сделаю это:
"matchabc".split(/^(match)/)
Я получил:
["", "match", "abc"]
Это потому, что круглые скобки отражают то, на чем я разделяюсь.Это немного похоже на поведение, которое вы описываете - было бы легче понять, если бы вы опубликовали пример, иллюстрирующий проблему (не только регулярное выражение, но и то, как вы его используете, и строку, на которую оно действует).