查找不完整 Java 断言的正则表达式

Regular Expression to find incomplete Java assertions

在 Java 中,您可以使用如下 assert() 语句:

// ok
assertFalse(",", Boolean.FALSE);
assertFalse("", Boolean.FALSE);
assertFalse("ab" + "cd" + "de", Boolean.FALSE);
assertFalse(errorMessage, Boolean.FALSE);
assertFalse(errorMessage.toString(), Boolean.FALSE);
assertFalse("Assertion failed, because: " + errorMessage.toString(), Boolean.FALSE);

// nok    
assertFalse(Boolean.FALSE);
assertFalse(expectedMessage.endsWith("ab,cd"));

从代码风格的角度来看,我们将断言定义为 OK 如果断言将断言错误消息作为第一个参数并且 NOK = Not OK 如果没有。

话虽如此,我需要一个正则表达式来搜索圆括号 () 中没有逗号的断言。字符串常量内的逗号(用引号 " 分隔)也必须排除,因为它们会导致误报。

我最终得到了这个正则表达式,它显然没有考虑引号,因为我无法让它们为我工作:

assert(False|NotNull|Null|True)\(\s*.*(?!,).*\s*\);

我们还使用 assertEqualsassertSame,它们需要三个逗号,但这可以是一个单独的正则表达式。

对此有什么想法或解决方案吗?我们如何找到只有一个参数的 assertFalse() 语句?

请不要想出任何其他工具或插件,因为它们是被禁止使用的。只是纯正则表达式。谢谢。

See regex in use here

assert(?:False|(?:Not)?Null|True)\([^(),]*(?:\([^)]*\))*\);
  • assert字面匹配
  • (?:False|(?:Not)?Null|True) 匹配 FalseNotNullNullTrue
  • \( 按字面意思匹配 (
  • [^(),]* 匹配除 (),
  • 之外的任意数量的任意字符
  • (?:\([^)]*\))* 匹配以下任意次数
    • 匹配 (,后跟除 ) 之外的任何字符任意次数,然后是 )
  • \); 按字面意思匹配 );

然而,要正确捕获这些实例,您最好编写一个解析器,因为 Java 的正则表达式引擎不允许递归或平衡。这意味着正则表达式(就像我提供的那样)将在 () 内的嵌套 () 上中断,例如 assertFalse(something(somethingelse()));。如果你不关心这些情况,那么你可以使用正则表达式,否则,我建议你创建一个解析器或使用其他方法。