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

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

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

я пробовал

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

которую я намеревался поймать в ловушку:

тег cfquery, за которым следует любое количество символов, которые не являются закрывающими >, НЕ сопровождаются атрибутом имени, за которым следует любое количество символов, которые не являются закрывающими >, за которыми следует закрывающее >.

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

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

2 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам