Регулярное выражение проблемы - PullRequest
0 голосов
/ 26 августа 2009

Я изо всех сил пытался получить рабочее регулярное выражение для моего небольшого проекта. Может ли кто-нибудь помочь мне с регулярным выражением, которое соответствует чему-либо внутри <> символов, но только когда им не предшествует \ символ?

Например:

<Escaped characters \<\> are right in the middle of this sentence.>, <Here is another sentence.>

Должен совпадать

1: Square brackets \<\> are right in the middle of this sentence.
2: here is another sentence.

Пока я справился

/<([^\\][^>]*?)>/ig

но это дает

1: Escaped characters \<\
2: Here is another sentence.

Что я делаю не так? (

Ответы [ 4 ]

1 голос
/ 26 августа 2009

Я бы использовал это:

/<((?:[^\\>]+|\\.)*)>/
1 голос
/ 26 августа 2009

Ответ Кримсона не работает для меня при тестировании его в Regex Powertoy с использованием <Escaped characters \<\> are right in the middle of this sentence.>, <Here is another sentence.> в качестве теста, но это (кажется) работает:

/<(?<!\\<).*?>(?<!\\>)/gi

Дает мне два матча: <Escaped characters \<\> are right in the middle of this sentence.> и <Here is another sentence.>

Редактировать : Я посмотрел на строку, которая, по словам Гамбо, не совпадает. У меня нет проблем с соответствием в regex.powertoy.org:

альтернативный текст http://img362.imageshack.us/img362/3227/regexpowertoyorg.png

При тестировании я изменил исходное опубликованное регулярное выражение на: /(?<!\\)<(.*?)(?<!\\)>/gi, что более эффективно (меньше проб).

Также в выводе regex.powertoy.org я замечаю, что четвертая строка (\<hello <match\<this\>> but not this\> looks odd... the printed replacement is just match but the match detail clearly shows that the match is correct; match \ . But I also notices that the first and third test string replacements don't print the " `" выходит за пределы угловых скобок. После небольшой (но не исчерпывающей) игры вокруг I думаю, что это проблема с отображением текста через javascript, экранированные угловые скобки не печатают escape-символ, а непустые угловые скобки вообще не печатаются. Я думаю, это связано с просмотром javascript это как HTML. Итак, я думаю, что это регулярное выражение работает правильно. Но вы должны проверить его в автономном режиме.

0 голосов
/ 26 августа 2009

Попробуйте это

/<[^\\]([^>]+)>/
0 голосов
/ 26 августа 2009

Что вам нужно, так это операторы, работающие по принципу «назад». Читайте о них здесь:

http://www.perl.com/pub/a/2003/07/01/regexps.html

А вот выражение, которое вам нужно:

/<(?!<\\).*>(?!<\\)/

Поскольку оператор * выше является жадным, он должен включать любые экранированные угловые скобки / </>

РЕДАКТИРОВАТЬ: Я предполагаю, что вы хотите, чтобы экранированные угловые скобки были сопоставлены и возвращены. Если вы хотите что-то другое, уточните - приведите краткий пример а) входной строки и б) соответствия, которое будет возвращено

...