【问题标题】:Regex - optional non capturing group not matched正则表达式 - 不匹配的可选非捕获组
【发布时间】:2021-03-11 08:24:12
【问题描述】:

我尝试使用正则表达式从“一些其他数据。FlowSessionId:bf4a15d2-86ec-4717-8acc-f7d5229f250f 附加数据”匹配:

.*?(?:FlowSessionId:\s([\S]+))?.*

flowSessionId 信息组是可选的。当它存在时,我提取“bf4a15d2-86ec-4717-8acc-f7d5229f250f”数据。

问题是,当我尝试将组设为可选时(在非捕获组的末尾使用 ?),我将不再收到组匹配。请参阅此处的示例:https://regex101.com/r/FU4IkM/1

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    您可以省略非捕获组和方括号,将部分与捕获组匹配,或匹配整行。

    .*?\bFlowSessionId:\s(\S+).*|.+
    

    模式匹配:

    • .*?\bFlowSessionId:\s 匹配尽可能少的字符,然后匹配 FlowSessionId:
    • (\S+).* 在第 1 组中捕获 1+ 个非空白字符,然后是该行的其余部分
    • |或者
    • .+ 匹配任意字符 1+ 次

    Regex demo

    const regex = /.*?\bFlowSessionId:\s(\S+).*|.+/;
    [
      "Some other data.FlowSessionId: bf4a15d2-86ec-4717-8acc-f7d5229f250f additional data",
      "Some other data. additional data"
    ].forEach(s => {
      let m = s.match(regex);
      console.log(m[1] ? m[1] : m[0]);
    })

    【讨论】:

    • 或 (|) 运算符我只在 (a|b|c) 之类的语法中使用。在这种情况下,它似乎适用于从 \b 开始的左侧组和从“I”开始的右侧部分。什么是分组/优先级规则?
    • @Ghita | 的左边部分首先被评估。如果左侧部分不匹配,则将评估右侧部分,这将匹配整行至少一个字符。
    • 我从这里regex101.com/r/64rpUT/1询问关于更复杂情况(基于这个问题)的一般规则,匹配不起作用。流匹配后还有其他一些组。跨度>
    • @Ghita 在这种情况下,您不必使用.*,因为它会匹配太多,并且由于文本已经匹配,替代方案可能不匹配。例如,您可以使用 regex101.com/r/sRTTSi/1 或以正确的顺序匹配组,并使用单个交替,以防左侧部分不匹配 regex101.com/r/aZkee1/1
    • @FourthB 在这种情况下我有 2 个匹配“对象”?想知道我是否只能进行一场比赛,然后将其设置为第 1 组是可选的(其他的是必需的)。您定义的分隔有效,但从逻辑上讲,我想要一个匹配对象。
    【解决方案2】:

    仅当 FlowSessionId: 文本存在时才使用正向后向匹配:

    (?<=FlowSessionId:\s)(\S+)
    

    解释:

    • (?&lt;=FlowSessionId:\s) - 会话 ID 标签的正向回溯;如果失败,则整个正则表达式都会失败
    • (\S+) - 匹配并捕获 ID(如果后向匹配)

    请注意,某些浏览器,尤其是 IE 不支持后视。

    【讨论】:

    • 这是一个有趣的结构,但我的正则表达式匹配不希望失败,因为 flowSessionId 是可选的。
    • @Ghita:现在明白了。从您的描述中我并不清楚您仍然想匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 2021-12-24
    • 2021-04-08
    • 1970-01-01
    相关资源
    最近更新 更多