Сложность с простым регулярным выражением (совпадение префикса / суффикса) - PullRequest
2 голосов
/ 28 декабря 2008

Я пытаюсь разработать регулярное выражение, которое будет использоваться в программе на C # ..

Мое первоначальное регулярное выражение было:

(?<=\()\w+(?=\))

Что успешно соответствует "(foo)" - сопоставление, но исключение из вывода открытых и закрытых паренов, для получения просто "foo".

Однако, если я изменю регулярное выражение на:

\[(?<=\()\w+(?=\))\]

и я пытаюсь найти совпадение с "[(foo)]", но оно не совпадает. Это удивительно. Я просто добавляю и добавляю буквальную открывающую и закрывающую скобку вокруг моего предыдущего выражения. Я в тупике. Я использую Expresso для разработки и проверки своих выражений.

Заранее благодарим за помощь.

Роб Сесил

Ответы [ 2 ]

6 голосов
/ 28 декабря 2008

Ваши взгляды - проблема. Вот как обрабатывается строка:

  1. Мы видим [в строке, и это соответствует регулярному выражению.
  2. Заглядывание в регулярном выражении просит нас посмотреть, был ли предыдущий символ '('. Это не удалось, потому что это был '['.

По крайней мере, это то, что я предполагаю, вызывает проблему.

Попробуйте вместо этого следующее регулярное выражение:

(?<=\[\()\w+(?=\)\])
3 голосов
/ 28 декабря 2008

Вне контекста, это трудно судить, но забывчивость здесь, вероятно, излишняя. Они полезны для исключения строк (как в примере Стрейгера) и в некоторых других особых обстоятельствах, когда простые RE терпят неудачу, но я часто вижу их использование там, где более простые выражения легче писать, работать в большем количестве разновидностей RE и, вероятно, быстрее.
В вашем случае вы, вероятно, могли бы написать, например, (\b\w+\b), или даже (\w+), используя натуральные границы, или, если вы хотите отличить (foo) от -foo- (например), используя \((\w+)\).
Теперь, возможно, контекст диктует это запутанное использование (или, может быть, вы просто экспериментировали с оглядкой в ​​прошлое), но полезно знать альтернативы.

Теперь, если вам просто любопытно, почему второе выражение не работает: они известны как «утверждения нулевой ширины»: они проверяют, что то, что следует или предшествует, соответствует ожидаемому, но они не потреблять строку, поэтому все, что после (или перед отрицательным), должно совпадать с утверждением. Например. если вы положили что-то после положительного взгляда, которое не соответствует заявленному, вы уверены, что RE потерпит неудачу.

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