查找不完整 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*\);
我们还使用 assertEquals
和 assertSame
,它们需要三个逗号,但这可以是一个单独的正则表达式。
对此有什么想法或解决方案吗?我们如何找到只有一个参数的 assertFalse() 语句?
请不要想出任何其他工具或插件,因为它们是被禁止使用的。只是纯正则表达式。谢谢。
assert(?:False|(?:Not)?Null|True)\([^(),]*(?:\([^)]*\))*\);
assert
字面匹配
(?:False|(?:Not)?Null|True)
匹配 False
、NotNull
、Null
或 True
\(
按字面意思匹配 (
[^(),]*
匹配除 (
、)
或 ,
之外的任意数量的任意字符
(?:\([^)]*\))*
匹配以下任意次数
- 匹配
(
,后跟除 )
之外的任何字符任意次数,然后是 )
\);
按字面意思匹配 );
然而,要正确捕获这些实例,您最好编写一个解析器,因为 Java 的正则表达式引擎不允许递归或平衡。这意味着正则表达式(就像我提供的那样)将在 ()
内的嵌套 ()
上中断,例如 assertFalse(something(somethingelse()));
。如果你不关心这些情况,那么你可以使用正则表达式,否则,我建议你创建一个解析器或使用其他方法。
在 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)\([^(),]*(?:\([^)]*\))*\);
assert
字面匹配(?:False|(?:Not)?Null|True)
匹配False
、NotNull
、Null
或True
\(
按字面意思匹配(
[^(),]*
匹配除(
、)
或,
之外的任意数量的任意字符
(?:\([^)]*\))*
匹配以下任意次数- 匹配
(
,后跟除)
之外的任何字符任意次数,然后是)
- 匹配
\);
按字面意思匹配);
然而,要正确捕获这些实例,您最好编写一个解析器,因为 Java 的正则表达式引擎不允许递归或平衡。这意味着正则表达式(就像我提供的那样)将在 ()
内的嵌套 ()
上中断,例如 assertFalse(something(somethingelse()));
。如果你不关心这些情况,那么你可以使用正则表达式,否则,我建议你创建一个解析器或使用其他方法。