代码之家  ›  专栏  ›  技术社区  ›  membersound

如果一个字符在匹配中出现N次,如何匹配?

  •  0
  • membersound  · 技术社区  · 5 年前

    https://regex101.com/r/gNNlKM/2

    我想比赛 START:test:test:test:asd:xxx:yyy:zzz:12345:END 但是,只有当 : 发生4次或更多。

    一般而言,以下工程: (START.*?)\d+(:END) 但是我怎么能得到 :{4,} 进入?

    匹配字符串可能会重复多次。像: START:test:test:test:asd:xxx:yyy:zzz:12345:END...START:test:test:test:asd:xxx:yyy:zzz:12345:END... 重要的是 { 4,} 匹配仅应用于每个 START-END 令牌。

    旁注:我在这里使用的是匹配组,因为我想删除特殊情况下的数字。但对于如何让N次比赛进入这个问题来说,这并不重要。

    1 回复  |  直到 5 年前
        1
  •  3
  •   Pushpesh Kumar Rajwanshi    5 年前

    你可以这样写regex,

    (START(?:(?:(?!START)[^:])*:){3,})\d+(:END)
    

    只有当 : 正好包含在字符串中4次。

    说明:

    • (START -启动捕获组并匹配 START 字面
    • (?:(?:(?!START)[^:])*:){3,}) -这将匹配一些可选文本,并在看到文本时拒绝匹配 开始 紧随其后 : 哪里 {3,} 指三次或三次以上。
    • \d+ -匹配一个或多个数字
    • (:END) -再匹配一个 : END 从字面上捕捉到第2组

    Demo