Поиск на основе регулярных выражений в 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*+=)[^>])*>
И не забудьте убедиться, что флаг без учета регистра включен, если у вас могут быть теги / атрибуты в любом месте в смешанном / верхнем регистре.