0

我有一些正则表达式,但我在 CFEclipse 中努力确定找到的语法:

包含属性名称的cfquery标记的所有实例

我试过了

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

我打算陷阱:

cfquery 标记,后跟任意数量的非结束字符>NOT后跟name属性,后跟任意数量的非结束字符>,然后是结束>

这会找到很多匹配项,其中一些确实包含name属性,而另一些则不包含(因此它显然是不正确的)。

任何人都可以用这个线索棒打我吗?谢谢!

4

2 回答 2

2

看起来您应该为此使用 XML 解析器,但您的问题是它[^>]*是贪婪的,并且将通过name属性(如果存在)进行匹配。您需要以下内容:

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

通过将[^>]*移到负前瞻中,您可以确保在 next 之前的字符串中不存在 "name=" >

于 2011-08-25T16:27:10.467 回答
1

如果你想让你的前瞻作用于每个字符直到开始标记结束,你需要拆分字符类和量词,如下所示:

<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.

于 2011-08-26T13:00:38.957 回答