为什么我的正则表达式只返回一组?

Why my Regex is only giving me ONE group back?

我目前创建的正则表达式有问题。正则表达式必须提取所有在 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。

您可以使用

(?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