这些是我的一些测试用例:
{APIDETAILS=FOO, BAR, SING, RUN, OP1/OPSUB1/RESULT=SOMETHING, OP1/OPSUB2/RESULT=SOMETHING, OP2/OPSUB1/RESULT=SOMETHING}
{APIDETAILS=FOO, OP1/OPSUB1/RESULT=SOMETHING, OP1/OPSUB2/RESULT=SOMETHING, OP2/OPSUB1/RESULT=SOMETHING}
{APIDETAILS=FOO, O.P.OP3/OPSUB1/RESULT=SOMETHING, OP1/OPSUB2/RESULT=SOMETHING, OP2/OPSUB1/RESULT=SOMETHING}
{APIDETAILS=FOO, OP.PO.OP4/OPSUB1/RESULT=SOMETHING, OP1/OPSUB2/RESULT=SOMETHING, OP2/OPSUB1/RESULT=SOMETHING}
{OP1/OPSUB1/RESULT=SOMETHING, OP1/OPSUB2/RESULT=SOMETHING, OP2/OPSUB1/RESULT=SOMETHING, APIDETAILS=FOO}
{OP1/OPSUB1/RESULT=SOMETHING, OP1/OPSUB2/RESULT=SOMETHING, OP2/OPSUB1/RESULT=SOMETHING, APIDETAILS=FOO, SING, BAR}
{OP1/OPSUB1/RESULT=SOMETHING, OP1/OPSUB2/RESULT=SOMETHING, OP2/OPSUB1/RESULT=SOMETHING, APIDETAILS=FOO, BAR, SING
注意: '}'在最后一行被故意遗漏。
我要匹配的:所有内容后面都有APIDETAILS,但仅限于APIDETAILS的末尾。如果没有明确定义结束(为不同的场景寻找上面的测试用例)
我想到的正则表达式:
(?:APIDETAILS=)(.*?)(?:}|/|$)
我能匹配的:
- foo, bar, sing, run, op1
- FOO, OP1
- FOO, O.P.OP3
- FOO, OP.PO.OP4
- FOO
- foo, sing, bar
- foo, bar, sing
问题:我如何在上面的1,2,3,4中消除一些噪声,最终只剩下以下内容?
我需要匹配的:
- foo, bar, sing, run
- FOO
- FOO
- FOO
- FOO
- foo, sing, bar
- foo, bar, sing
使用
(?m)(?<=APIDETAILS=).*?(?=,s*S+=|}|$)
查看中的匹配,regex演示。
-
(?m)
打开多行模式,允许^
和$
在每条线上匹配 - 后面的
(?<=APIDETAILS=)
断言前面的是APIDETAILS=
-
.*?
延迟匹配字符到… - 前瞻
(?=,s*S+=|}|$)
可以断言后面是逗号,后跟可选的空格,非空格字符和=
,或|
}
字符或行尾$
的位置
使用正面向前看:
APIDETAILS=(.*?)(?=}|,s*S+=|$)
现场演示
或者直接添加到非捕获组:
APIDETAILS=(.*?)(?:}|,s*S+=|$)