我有一些正则表达式,但我在 CFEclipse 中努力确定找到的语法:
不包含属性名称的cfquery标记的所有实例
我试过了
<cfquery [^>]*(?!(name=))[^>]*>
我打算陷阱:
cfquery 标记,后跟任意数量的非结束字符>,NOT后跟name属性,后跟任意数量的非结束字符>,然后是结束>。
这会找到很多匹配项,其中一些确实包含name属性,而另一些则不包含(因此它显然是不正确的)。
任何人都可以用这个线索棒打我吗?谢谢!
我有一些正则表达式,但我在 CFEclipse 中努力确定找到的语法:
不包含属性名称的cfquery标记的所有实例
我试过了
<cfquery [^>]*(?!(name=))[^>]*>
我打算陷阱:
cfquery 标记,后跟任意数量的非结束字符>,NOT后跟name属性,后跟任意数量的非结束字符>,然后是结束>。
这会找到很多匹配项,其中一些确实包含name属性,而另一些则不包含(因此它显然是不正确的)。
任何人都可以用这个线索棒打我吗?谢谢!
看起来您应该为此使用 XML 解析器,但您的问题是它[^>]*
是贪婪的,并且将通过name属性(如果存在)进行匹配。您需要以下内容:
<cfquery (?![^>]*name=)[^>]*>
通过将[^>]*
移到负前瞻中,您可以确保在 next 之前的字符串中不存在 "name=" >
。
如果你想让你的前瞻作用于每个字符直到开始标记结束,你需要拆分字符类和量词,如下所示:
<cfquery\b(?:(?!name=)[^>])*>
注意\b
(单词边界)而不是空格 - 这将允许<cfquery>
匹配(同时仍然阻止<cfqueryparam...>
标签。(\b
在字母数字字符之后确保下一个字符是非字母数字。)
同样值得指出的是,(?:
...)
是一个非捕获组 - 类似于正常(
...)
但不会创建反向引用,因为我们不需要它。
当然,这种不正确匹配的可能性很小——如果你有一个属性notname
或者你有name = "whatever"
这些都将被错误地对待。
为了解决这个问题,这次我们可以\b
在名称之前再次使用 a,然后使用可选\s
的来允许(但不要求)属性名称和等号之间的任何空格:
<cfquery\b(?:(?!\bname\s*+=)[^>])*>
And don't forget to make sure case-insensitive flag is enabled, if you might have tags/attributes in mixed/uppercase anywhere.