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

用于查找不完整Java断言的正则表达式,java,regex,assert,regex-lookarounds,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); assertFals

在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*\);
我们还使用了
assertEquals
assertSame
,它们需要三个逗号,但这可能是一个单独的正则表达式

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

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

  • assert
    逐字匹配
  • (?:False |(?:Not)?Null | True)
    匹配
    False
    NotNull
    Null
    True
  • \(
    匹配
    字面意思
  • [^(),]*
    匹配除
  • (?:\([^)]*\)*
    匹配以下任意次数
    • 匹配
      ,后跟除
      以外的任何字符)
      任意次数,然后是
  • \);
    匹配
    );
    字面意思
但是,为了正确捕获这些实例,最好编写一个解析器,因为Java的正则表达式引擎不允许递归或平衡。这意味着正则表达式(如我提供的正则表达式)将在
()
中的嵌套
()
上中断,例如
assertFalse(somethingelse())如果您不关心这些情况,那么可以使用regex,否则,我建议您创建一个解析器或使用其他方法。

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

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

这被否决的原因是什么?如果你能给我指出正确的方向,我想改进一下:)它确实得到了OP想要的答案,而且他们确实指定了一个纯正则表达式解决方案是必要的。我的猜测是因为建议使用解析器。我的第一个想法是“这太复杂了,有很多工具可以找到被禁止方法的用法”。然后我读到“请不要想出任何其他工具或插件,因为它们是被禁止使用的。”(我觉得很奇怪,因为在这里工具通常是明确的方式)。在这种情况下,一个简单的解析器也不是一个坏主意。@NickL谢谢,我接受了你的建议并把它移到了结尾:)也许把解析器的建议移到了结尾?对于只读第一行的下层选民来说。我想得越多,正则表达式对我来说就越糟糕。有很多方法可以打破它。转义字符,逗号在字符串中,com马在右手边。等等。下一票是因为建议使用正则表达式来解析代码。这就是为什么我不回答这样的问题,通常情况下,当存在专门的代码解析库时。这是为什么被下一票的原因吗?如果你能给我指出正确的方向,我想改进一下:)它确实得到了操作的答案我的猜测是因为建议使用解析器。我的第一个想法是“这太复杂了,有很多工具可以找到禁用方法的用法”。然后我读到“请不要想出任何其他工具或插件,因为它们是禁用的。”(我觉得这很奇怪,因为工具通常是很好的选择)。在这种情况下,一个简单的解析器也不是一个坏主意。@NickL谢谢,我接受了你的建议并把它移到了最后:)也许把解析器的建议移到最后?对于只读第一行的下一个投票者来说。我想得越多,正则表达式对我来说就越糟糕。有很多方法可以打破它。转义字符,逗号在字符串中,逗号在右边。等等。下一个投票者是因为建议正则表达式解析代码。这就是为什么我不回答这样的问题通常,当存在专用代码解析库的可能性很大时,会出现问题。
assert(?:False|(?:Not)?Null|True)\([^(),]*(?:\([^)]*\))*\);