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

时间:2014-07-23 22:51:08

标签: regex regex-negation regex-greedy

以下是我的一些测试案例:

{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=)(.*?)(?:}|\/|$)

我能够匹配的内容:

  1. FOO,BAR,SING,RUN,OP1
  2. FOO,OP1
  3. FOO,O.P.OP3
  4. FOO,OP.PO.OP4
  5. FOO
  6. FOO,SING,BAR
  7. FOO,BAR,SING
  8. 问题:如何摆脱上述比赛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

2 个答案:

答案 0 :(得分:2)

使用肯定前瞻

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

Live Demo

或者只是添加到您的非捕获组:

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

答案 1 :(得分:2)

使用此:

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

查看 the regex demo 中的匹配项。

  • (?m)启用了多行模式,允许^$在每一行匹配
  • lookbehind (?<=APIDETAILS=)声称前面的内容是APIDETAILS=
  • .*?懒惰地将字符匹配到......
  • 前瞻(?=,\s*\S+=|}|$)可以断言后面的内容是逗号后跟可选空格,非空格字符和=,或| }字符或者行$
  • 的结尾