Я пытаюсь разработать регулярное выражение, которое будет использоваться в программе на С#.
Мое начальное регулярное выражение:
(?<=\()\w+(?=\))
Что успешно соответствует "(foo)" - сопоставление, но исключение из вывода open и close parens, чтобы произвести просто "foo".
Однако, если я изменяю регулярное выражение на:
\[(?<=\()\w+(?=\))\]
и я пытаюсь сопоставить "[(foo)]" он не подходит. Это удивительно. Я просто добавляю и добавляю буквальную открытую и закрытую фигуру вокруг моего предыдущего выражения. Я в тупике. Я использую Expresso для разработки и тестирования своих выражений.
Заранее благодарим за вашу любезную помощь.
Роб Сесил
Из контекста трудно судить, но взгляд здесь, вероятно, перебор. Они полезны для исключения строк (например, в примере строгара) и в некоторых других особых случаях, когда простое RE завершается с ошибкой, но я часто вижу, что они используются там, где более простые выражения легче писать, работают в более RE-вариантах и, вероятно, быстрее.
В вашем случае вы, вероятно, могли бы написать (\b\w+\b)
например, или даже (\w+)
с использованием естественных границ, или если вы хотите отличить (foo) от -foo- (например), используя \((\w+)\)
.
Теперь, возможно, контекст диктует это запутанное использование (или, возможно, вы просто экспериментировали с внешним видом), но хорошо знать альтернативы.
Теперь, если вам просто интересно, почему второе выражение не работает: они известны как "утверждения с нулевой шириной": они проверяют, соответствует ли то, что соответствует или предшествует, что ожидается, но они не потребляйте строку так, чтобы что-либо после (или раньше, если было отрицательно), должно совпадать с утверждением. Например. если вы положили что-то после положительного взгляда, который не соответствует тому, что утверждается, вы уверены, что RE не сработает.
Ваши взгляды - проблема. Здесь, как обрабатывается строка:
По крайней мере, это то, что, я думаю, вызывает проблему.
Попробуйте это регулярное выражение:
(?<=\[\()\w+(?=\)\])