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

时间:2018-04-06 14:52:13

标签: java regex assert regex-lookarounds

在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"));

从代码样式的角度来看,如果断言将断言错误消息作为第一个参数并且 NOK = Not OK ,则将断言定义为 OK 不存在。

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

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

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

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

有关于此的任何想法或解决方案吗?我们怎样才能找到只有一个参数的assertFalse()语句?

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

1 个答案:

答案 0 :(得分:2)

See regex in use here

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

但是,要正确捕获这些实例,最好编写解析器,因为Java的正则表达式引擎不允许递归或平衡。这意味着正则表达式(就像我提供的那样)会在()内的()嵌套assertFalse(something(somethingelse()));中断,例如configFile: path.join(__dirname+'../test/karma.conf.js'), 。如果您不关心这些情况,那么您可以使用正则表达式,否则,我建议您创建解析器或使用其他方法。