正则表达式:空格和在非捕获组中

Regex: whitepsace and   in non-capturing group

我在 PHP 中使用正则表达式来匹配时间字符串。我想在非捕获组中包括白色 space 和   以获得以下匹配:

比赛:晚上 10 点
比赛:10 下午

这是我正在使用的正则表达式,但它不匹配  

的项目
(\b)(\d{1,2}:\d\d|\d{1,2})(?:\s|&nbsp;)(a\.?m\.?|p\.?m\.?)(\s|<|$|,)

如果你想匹配这两个值,你可以编写并将模式缩短为:

\b\d{1,2}(?::\d\d)?(?:\s?|&nbsp;)[ap]\.?m\b
  • \b一个单词边界
  • \d{1,2}匹配1-2位数字
  • (?::\d\d)? 可选匹配 : 和 1-2 位
  • (?:\s?|&nbsp;) 匹配可选的空白字符或 &nbsp
  • [ap]\.?m 匹配 ap 可选点和 m
  • \b一个单词边界或者使用(?:\s|<|$|,)

Regex demo

/\b\d{1,2}(?:\s*(?:&nbsp;)?\s*)?(?:[ap]m\b|[ap]\.m\.)/

/\b\d{1,2}(?:\s*(?:&nbsp;)?\s*)?(?:[ap]m\b|[ap]\.m\.)/
  • \b 断言单词边界处的位置:(^\w|\w$|\W\w|\w\W)

  • \d 匹配一个数字(相当于 [0-9]

    • {1,2} 匹配前一个令牌 12 次,尽可能多的次数,根据需要回馈(贪心)
  • Non-capturing组(?:\s*(?:&nbsp;)?\s*)?

    • ? 在零到一次之间匹配前一个标记,尽可能多的次数,根据需要回馈(贪婪)

      • \s 匹配任何空白字符(相当于 [\r\n\t\f\v ]

      • * 在零次和无限次之间匹配前一个标记,尽可能多的次数,根据需要回馈(贪婪)

      • Non-capturing组(?:&nbsp;)?

        • ? 在零到一次之间匹配前一个标记,尽可能多的次数,根据需要回馈(贪婪)

          • &nbsp; 匹配字符   字面意思
      • \s 匹配任何空白字符(相当于 [\r\n\t\f\v ]

      • * 在零次和无限次之间匹配前一个标记,尽可能多的次数,根据需要回馈(贪婪)

  • Non-capturing组(?:[ap]m\b|[ap]\.m\.)

    • 第一个备选方案[ap]m\b

      • 匹配下面列表中的单个字符[ap]

        • ap 匹配列表中的单个字符 ap
      • m 匹配字符 m 字面意思

      • \b 断言单词边界处的位置:(^\w|\w$|\W\w|\w\W)

    • 第二个选择[ap]\.m\.

      • 匹配下面列表中的单个字符[ap]

        • ap 匹配列表中的单个字符 ap
      • \. 匹配字符 . 字面意思

      • m 匹配字符 m 字面意思

      • \. 匹配字符 . 字面意思

  • 全局模式标志

    • g 修饰符:g 局部。所有比赛(第一场比赛后不要return)

console.log(`
  Match10pm<br>
  Match:100pm<br>
  Match:10pm<br>          - match
  Match:10  pm<br>        - match
  Match:10 pmm<br>
  Match: 10p.m<br>
  Match: 10p.m.<br>       - match
  Match: 10 pm <br>       - match
  Match: 10&nbsp;pm       - match
  Match: 10&nbsp;pmm
  Match: 10&nbsp; pm<br>  - match
  Match: 10 &nbsp;pm<br>  - match
  Match: 10 &nbsp; pm<br> - match`
    // see ... [https://regex101.com/r/9186yf/2]
    .match(/\b\d{1,2}(?:\s*(?:&nbsp;)?\s*)?(?:[ap]m\b|[ap]\.m\.)/g)
);
.as-console-wrapper { min-height: 100%!important; top: 0; }