Поиск на основе регулярных выражений в CFEClipse для тегов, не содержащих атрибут - PullRequest
0 голосов
/ 25 августа 2011

У меня есть несколько регулярных выражений, но я стараюсь в CFEclipse найти синтаксис, который находит:

все экземпляры тега cfquery , которые не содержит атрибут имя

Я пытался

<cfquery [^>]*(?!(name=))[^>]*>

, который я собирался поймать:

тег cfquery, за которым следует любое количество символов, которые не являются закрывающими > , NOT , за которыми следует атрибут name , за которым следуетна любое количество символов, которые не являются закрывающими > , за которыми следует закрывающий > .

Это находит множество совпадений, некоторые из которых do содержит атрибут name , а некоторые из них не имеют (так что это, очевидно, неправильно).

Может кто-нибудь ударить меня палкой для подсказки на этом?Спасибо!

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

Похоже, вы должны использовать для этого анализатор XML, но ваша проблема в том, что [^>]* является жадным и будет соответствовать атрибуту name , если он существует. Вам нужно что-то вроде следующего:

<cfquery (?![^>]*name=)[^>]*>

Переместив [^>]* в отрицательную сторону просмотра, вы можете убедиться, что «name =» не существует в строке до следующего >.

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

Если вы хотите, чтобы ваш lookahead действовал против каждого символа до конца открывающего тега, вам нужно разделить класс символов и квантификатор следующим образом:

<cfquery\b(?:(?!name=)[^>])*>

Обратите внимание на \b (границу слова) вместо пробела - это позволит <cfquery> совпадать (при этом все еще блокируя теги <cfqueryparam...>. (\b после буквенно-цифрового символа гарантирует, что следующий символ не алфавитно-цифровой). )

Также стоит отметить, что (?: ... ) - это группа без захвата - похожа на обычную ( ... ), но не создает обратную ссылку, так как нам не нужно это.

Конечно, есть небольшая вероятность того, что это не будет соответствовать правильно - если у вас есть атрибут notname или у вас есть name = "whatever", они оба будут обработаны неправильно.

Чтобы решить эту проблему, мы можем снова использовать \b перед именем на этот раз, а затем использовать необязательный \s, чтобы разрешить (но не требовать) любые пробелы между именем атрибута и знаком равенства:

<cfquery\b(?:(?!\bname\s*+=)[^>])*>

И не забудьте убедиться, что флаг без учета регистра включен, если у вас могут быть теги / атрибуты в любом месте в смешанном / верхнем регистре.

...