我希望所有复选框变量都以“ ckx”开头。
^.*JCheckBox((?! ckx).)*$
这适用于变量声明,但也匹配定义。 例如。
ckxSomeCheckbox = new JCheckBox();
有什么主意如何防止将此代码显示为错误?
有效示例:
private JCheckBox ckxTest = new JCheckBox();
public javax.swing.JCheckBox ckxTest;
无效的示例:
private JCheckBox abcTest;
private JCheckBox abcckxTest;
ckxTest = new JCheckBox();
ckxTest = new JCheckBox("");
答案 0 :(得分:1)
我建议使用RegexpMultiline检查,以便您发现有人在不方便的地方将换行符插入代码的情况。
正则表达式为\bJCheckBox\b\s*(?!ckx[A-Z])\w+
(explanation / examples)。
<module name="RegexpMultiline">
<property name="format" value="\bJCheckBox\b\s*(?!ckx[A-Z])\w+"/>
<property name="message" value="Missing prefix 'ckx' on checkbox variable"/>
<property name="fileExtensions" value="java"/>
</module>
请注意,我删除了错误标识符位于行开头的行,因为这些行将无法编译。除非您早先声明了变量,否则在这种情况下,将标记为问题所在。
ckxTest = new JCheckBox();
ckxTest = new JCheckBox("");
使用正则表达式进行检查并不完美,因为人们可以使用注释或子类来混淆检测器。因此,使用PMD XPath rule之类的方法会更强大,但这是另一个问题。 :-)
使用RegexpSinglelineJava可以达到相同的效果,该功能增加了忽略注释的功能,但会因意外的换行符而出轨:
<module name="RegexpSinglelineJava">
<property name="format" value="\bJCheckBox\b\s*(?!ckx[A-Z])\w+"/>
<property name="message" value="Missing prefix 'ckx' on checkbox variable"/>
<property name="ignoreComments" value="true"/>
</module>