поиск по шаблону найти символ больше чем, используя регулярное выражение - PullRequest
3 голосов
/ 14 июня 2011

Мне нужно регулярное выражение, чтобы при поиске «>» было больше, чем.

например

для этой строки я получу истину - "if x> 2"

и для этой строки я получу false "<template>"

Я пробовал это - [^<][a-zA-Z0-9_]+[a-zA-Z0-9_ ]*> как регулярное выражение но проблема в том, что он находит подстроку, которая соответствует например, в <template> он находит template> и возвращает true.

спасибо.

EDIT:

Я использую это регулярное выражение [^<a-zA-Z0-9_][a-zA-Z0-9_]+[ ]*> пробовал его по всему исходному коду Firefox 1.0, и, похоже, оно работает нормально.

Ответы [ 2 ]

3 голосов
/ 14 июня 2011

Регулярное выражение кажется неправильным инструментом для работы, которую вы пытаетесь сделать. Вероятно, вам понадобится полноценный синтаксический анализатор C ++, чтобы надежно различать «>» оператор «больше» из ">" разделителя шаблона или ">" как часть строкового литерала или комментария.

3 голосов
/ 14 июня 2011

Звучит так, как будто вы хотите сопоставить строки, содержащие >, но не <.Этот шаблон будет делать это:

/^(?=.*>)[^<]+$/

Однако мне любопытно, почему вы хотите это сделать.Звучит подозрительно, будто вы пытаетесь проанализировать HTML с помощью регулярных выражений, которые обычно являются плохой идеей.

РЕДАКТИРОВАТЬ:

Теперь стало понятнее, что вы пытаетесь сделать, но вы должны знать, что это расширяет границы возможностей регулярных выражений.Они не могут реально отличить объявление шаблона от текста с угловыми скобками, но если вы знаете, что все объявления шаблона соответствуют очень специфическому шаблону, вы можете довольно хорошо их поймать.

Если все ваши объявления шаблонов следуют шаблону <[0-9]+template>, вы можете сделать это:

/^.*(?<!<\d+template)>.*$/

Если ваши шаблоны не следуют такому строгому соглашению, вам нужен настоящий синтаксический анализатор C ++ для этого.Для регулярного выражения будет невозможно определить разницу между объявлением шаблона и этим:

a=b<c>d;

... который является допустимым кодом на C ++ (я полагаю, перевод a = (b < c) > d;).

...