首页 > 解决方案 > 如何匹配以 4 位数字开头但忽略前面有冒号的字符串

问题描述

我正在尝试匹配以 4 位数字开头的所有子字符串,但数字前面有冒号的子字符串除外。
到目前为止,我有以下内容:

细绳:

1547 blabla bla 2458 blablabla bla:1548 blabla 8547 blablabla

正则表达式:

\d{4} .*?(?=\d{4})

这导致以下结果:

1547 blabla bla   
2458 blablabla bla:  
1548 blabla 

然而,期望的结果是:

1547 blabla bla   
2458 blablabla bla:1548 blabla  
8547 blablabla

我尝试了以下但没有成功:

(?<!:)\d{4} .*?(?=\d{4})

https://regex101.com/r/Zw6Wpw/1

标签: javascriptregex

解决方案


你可以使用这个正则表达式:

\b\d{4}\b.*?(?=[^:]\d{4}\b|$)

更新的正则表达式演示

正则表达式解释

  • \b: 字边界
  • \d{4}: 匹配 4 位数字
  • \b: 字边界
  • .*?: 匹配 0 个或多个任意字符(惰性匹配)
  • (?=[^:]\d{4}\b|$): 提前断言我们前面有非冒号字符和 4 位数字的单词,或者有行尾位置

或者,您也可以将此正则表达式与嵌套的否定后视一起使用:

\b\d{4}\b.*?(?=(?<!:)\d{4}\b|$)

推荐阅读