条件正则表达式匹配不在引号内的时间戳

时间:2016-02-20 05:51:21

标签: regex

我只想匹配不在引号内的时间戳:

  

03:00

     

2:00

     

10:00

     

03:00

     

1时04分01秒

     

1时04分01秒

而不是这些:

  

“2:00”

     

“10:00”

     

“1点04分01秒”

我有表达式:

(?!["'])\b(\d{1,2}:\d{2})(?::\d{2})?\b(?!["'])

它工作正常,但它不应该选择这个“01:04:01”

我正在工作https://regex101.com/r/vS2sT9/4

1 个答案:

答案 0 :(得分:1)

根据您的初始正则表达式,一个选项是更改否定前瞻以选择性地匹配数字/冒号字符,直到引号:(?![:\d]*["'])

Updated Example

\b(?:(\d{1,2}:\d{2})(?::\d{2})?)(?![:\d]*["'])\b

您也可以将其更改为(?!(?::\d+)?["']),以便可选地匹配一个冒号后跟一个或多个数字:

Updated Example

\b(?:(\d{1,2}:\d{2})(?::\d{2})?)(?!(?::\d+)?["'])\b

但是,实际上可能更好的替代选项是使用替换以匹配引号之间的字符串,然后您可以使用捕获组来捕获实际日期:

Updated Example - 日期在第一个捕获组

["'].*?["']|\b(?:(\d{1,2}:\d{2})(?::\d{2})?)\b

您也可以使用反向引用来关闭引用:

Updated Example - 现在日期在第二个捕获组中,因为后引用的引用位于第一个捕获组中。

(["']).*?\1|\b(?:(\d{1,2}:\d{2})(?::\d{2})?)\b