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

2

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

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

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

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

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

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

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

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

Роб Сесил

Теги:

2 ответа

3
Лучший ответ

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

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

6

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

  • Мы видим [в строке и соответствуют регулярному выражению.
  • Look-behind в regex просит нас узнать, был ли предыдущий символ "(". Это не удается, потому что это "[..

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

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

(?<=\[\()\w+(?=\)\])
  • 0
    Мои мысли точно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню