正则表达式排除引号内的匹配

时间:2009-08-04 18:43:28

标签: java regex jsp refactoring intellij-idea

我正在研究这个相当大的重新分解项目,我正在使用intellij的find / replace和regexp来帮助我。

这是我正在使用的正则表达式:

\b(?<!\.)Units(?![_\w(.])\b

我发现大多数对我的用途无用的匹配是引号内的字符串匹配,例如:“units”

我想找到一种方法让上面的表达式在找到引号之间的匹配字符串时不匹配...

提前谢谢,这个地方摇滚!

2 个答案:

答案 0 :(得分:2)

假设引号始终在给定行上配对,您可以在偶数引号之前和之后创建匹配,并确保整行匹配:

^([^"]*("[^"]*")*[^"]*)*\b(?<!\.)Units(?![_\w(.])\b([^"]*("[^"]*")*[^"]*)*$

这是因为片段

([^"]*("[^"]*")*[^"]*)*

只会匹配成对的引号。通过添加开始和结束行锚点,它会强制正则表达式左侧和右侧的引号为偶数。

这将无法正确处理嵌入的转义引号,并且多行引用的字符串将会出现问题。

答案 1 :(得分:1)

Intellij使用Java正则表达式,不是吗?试试这个:

(?m)(?<![\w.])Units(?![\w(.])(?=(?:[^\r\n"\\]++|\\.)*+[^\r\n"\\]*+$)

第一部分是经过一次整容手术后的正则表达式:

(?<![\w.])Units(?![\w(.])

开头和结尾的\b实际上与\w的负向前瞻和负前瞻(分别)相同,所以我将它们折叠成现有的外观。如果新前瞻包含偶数(包括零)未转义的引号,则该前瞻符合该行的其余部分:

(?=(?:[^\r\n"\\]++|\\.)*+[^\r\n"\\]*+$)

处理像Welbog指出的那样的病态案例,与Michael的正则表达式不同,它会发现文本多次出现在同一行。但它没有考虑到评论。 Intellij的查找/替换功能是否足够智能,可以忽略评论中的文本?想一想,是不是内置了某种重构支持?