【问题标题】:Why my Regex is only giving me ONE group back?为什么我的正则表达式只给我一个组?
【发布时间】:2020-04-30 15:58:41
【问题描述】:

我目前正在创建的正则表达式存在问题。正则表达式必须提取在 Hello 和 Regards 之间显示数字 #### 的所有组。目前我的正则表达式只提取一个组,我需要里面的所有组,在这种情况下我有 2 个,但里面可能还有更多。

Regex Image

我正在使用网页https://regex101.com/

风格PCRE (PHP)

正则表达式Hello\s.*(number\s*[\d]*)\s.*Regards

文字

This is my test text number 25120
Hello my name is testing
I'm 20 years old
Please help me with the regex number 1542
I have been trying to create the regex many times this is my number 5152
Regards
I'm still trying my attempt number 5150

结果

我的结果只是组号 5152 但里面是另一个组号 1542。

【问题讨论】:

标签: regex pcre regex-group


【解决方案1】:

你可以使用

(?si)(?:\G(?!\A)|\bHello\b)(?:(?!\bHello\b).)*?\K\bnumber\s*\d+(?=.*?\bRegards\b)

请参阅regex demo

详情

  • (?si) - s - DOTALL 修饰符使 . 匹配任何字符,i 使模式不区分大小写
  • (?:\G(?!\A)|\bHello\b) - 上一场比赛的结束 (\G(?!\A)) 或 (|) 整个单词 Hello (\bHello\b)
  • (?:(?!\bHello\b).)*? - 任何字符,0 次或多次,但尽可能少,不会以整个单词开头Hello 字符序列
  • \K - 匹配重置运算符,丢弃到目前为止匹配的所有文本
  • \bnumber - 一个完整的词number
  • \s* - 0+ 个空格
  • \d+ - 1 位以上
  • (?=.*?\bRegards\b) - 在任何 0+ 个字符之后的某处必须有一个完整的词 Regards(尽可能少)。

【讨论】:

    猜你喜欢
    • 2018-06-14
    • 2022-11-22
    • 1970-01-01
    • 2020-02-15
    • 2023-02-16
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2022-10-15
    相关资源
    最近更新 更多