我已经找到了一些正则表达式,但是在CFEclipse中很难找到如下语法:
不包含属性名称的cfquery标记的所有实例
我试过了
<cfquery [^>]*(?!(name=))[^>]*>这是我想要捕捉的:
cfquery标记,后面跟着许多不是关闭>的字符,NOT后面跟着name属性,后面跟着任何数量的字符,这些字符不是结束的>,后面是结束的
E 116E 217。
这会发现大量匹配,其中一些do包含名称属性,而有些则没有(因此显然不正确)。
有人能用线索棒打我吗?谢谢!
发布于 2011-08-25 16:27:10
看起来您应该为此使用XML解析器,但您的问题是,[^>]*是贪婪的,如果存在名称属性,它将与之匹配。您需要以下内容:
<cfquery (?![^>]*name=)[^>]*>通过将[^>]*移动到负前瞻,您可以确保"name=“在下一个>之前不存在于字符串中。
发布于 2011-08-26 13:00:38
如果要对每个字符执行前瞻性操作,直到开始标记结束,则需要拆分字符类和量词,如下所示:
<cfquery\b(?:(?!name=)[^>])*>注意\b (word边界)而不是空格-这将允许<cfquery>匹配(同时仍然阻塞<cfqueryparam...>标记。(字母数字字符后面的\b确保下一个字符是非字母数字字符。)
同样值得指出的是,(?:.)是一个非捕获组,类似于普通的(.),但是不创建反向引用,因为我们不需要它。
当然,这种不匹配的可能性很小--如果您有一个属性notname或您有name = "whatever",那么这两者都将被错误地对待。
要解决这个问题,这次可以在名称之前再次使用\b,然后使用可选的\s允许(但不需要)属性名称和等号之间的任何空格:
<cfquery\b(?:(?!\bname\s*+=)[^>])*>如果您可能在任何地方都有混合/大写的标记/属性,请不要忘记启用了大小写不敏感的标记。
https://stackoverflow.com/questions/7193819
复制相似问题