поведение регулярного выражения «/^something/»

StackOverflow https://stackoverflow.com/questions/2202660

  •  18-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Здесь просто дикая догадка...единственный пример, который я могу придумать, может привести к изменению поведения, которое вы описываете:

/^foo|bar/

к

/^(foo|bar)/

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

Очень легко забыть эти скобки...Я тоже иногда это делала...краснею...;)

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

Другие советы

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

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

"matchabc".split(/^match/)

Я получил:

["", "abc"]

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

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

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

Я получил:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top