2010-07-26 169 views
3

我正在研究一个简单的工具来检查项目上的Java编码指南。 其中一条准则是验证没有像“private static ...”这样声明的变量,只允许“private static final ...”。哪个正则表达式查找不包含子字符串的字符串?

我想知道如何得到这个结果。我写了这一个:

pattern = "private\\\s*static\\\s*(?!final)"; 

但它不工作。我怎样才能得到没有“最终”关键字的条目?

感谢, 医学。

+1

如果有人声明一个私有的最终静态变量会怎么样? – 2010-07-26 02:25:57

+0

这是一个很好的问题。我会考虑那个......:| – Med 2010-07-26 02:29:51

+0

然后,模式将不会匹配它,因为'private \\ s * static'不匹配'private final static'。这不是问题,梅德。 – Amber 2010-07-26 02:30:02

回答

3

这应该工作,是的。您可能希望将第二个空格移到预见范围内:

pattern = "private\\s*static(?!\\s*final)"; 
+0

好的谢谢!事实上,当我移动预见范围内的空间时,它的工作会更好。 – Med 2010-07-26 02:24:42

0

使用\ s +来要求空间使其开始为我工作。

private\\s+static\\s+(?!final).+ 

我还添加了。+以匹配行的其余部分,这可能并不是您想要的。

2

我认为你是以错误的方式去解决这个问题的。写一个半体面的风格检查器是一项艰巨的任务,尤其是如果你要应付所有可能的“微不足道的”构造变体(例如不同的修改器命令)和所有可能的脆弱点(例如“点击”评论和字符串文字)。

海事组织,更好的办法是使用现有的源代码检查和定义自己的风格检查规则。这是easy to do in PMD。 PMD的优点是它的规则在解析的AST上运行。这使得它们对于语法变体的敏感性要比对源文件使用正则表达式匹配实现的任何东西都要敏感得多。

0

我同意安德鲁的回答(不论这是否是解决这个问题的正确方法)。你肯定应该使用\\s+而不是\\s*来检查是否存在空格,因为这些空格必须存在。你的正则表达式匹配privatestaticfoobar,这显然不是你想要的。

0

用正则表达式不能准确地做到这一点。编程语言需要解析器,不是正则表达式。这是一个基本定理。

相关问题