我只想匹配不在引号内的时间戳:
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”
答案 0 :(得分:1)
根据您的初始正则表达式,一个选项是更改否定前瞻以选择性地匹配数字/冒号字符,直到引号:(?![:\d]*["'])
。
\b(?:(\d{1,2}:\d{2})(?::\d{2})?)(?![:\d]*["'])\b
您也可以将其更改为(?!(?::\d+)?["'])
,以便可选地匹配一个冒号后跟一个或多个数字:
\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