当结束分隔符变化时,在前缀后匹配



这些是我的一些测试用例:

{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
  1. FOO, OP1
  2. FOO, O.P.OP3
  3. FOO, OP.PO.OP4
  4. FOO
  5. foo, sing, bar
  6. foo, bar, sing

问题:我如何在上面的1,2,3,4中消除一些噪声,最终只剩下以下内容?

我需要匹配的:

  1. foo, bar, sing, run
  2. FOO
  3. FOO
  4. FOO
  5. FOO
  6. foo, sing, bar
  7. foo, bar, sing

使用

(?m)(?<=APIDETAILS=).*?(?=,s*S+=|}|$)

查看中的匹配,regex演示

  • (?m)打开多行模式,允许^$在每条线上匹配
  • 后面的(?<=APIDETAILS=)断言前面的是APIDETAILS=
  • .*?延迟匹配字符到…
  • 前瞻(?=,s*S+=|}|$)可以断言后面是逗号,后跟可选的空格,非空格字符和=,或| }字符或行尾$
  • 的位置

使用正面向前看:

APIDETAILS=(.*?)(?=}|,s*S+=|$)

现场演示

或者直接添加到非捕获组:

APIDETAILS=(.*?)(?:}|,s*S+=|$)

最新更新