我有以下正则表达式来捕获正面&负时间偏移。
\b(?<sign>[\-\+]?)(?<hours>2[1-3]|[01][0-9]|[1-9]):(?<minutes>[0-5]\d)\b
匹配正常但前导符号不会出现在捕获组中。我格式化错了吗? 您可以在此处查看效果https://regex101.com/r/CQxL8q/1/
答案 0 :(得分:1)
这是因为第一个\b
。 \b
word boundary在字符串/换行符的开头与-
或+
(即非单词字符)之间不匹配。
您需要在可选的sign
组之后移动单词边界:
(?<sign>[-+]?)\b(?<hours>2[1-3]|[01][0-9]|[1-9]):(?<minutes>[0-5][0-9])\b
^^
请参阅regex demo。
现在,由于单词边界后面的字符是数字(单词字符),单词边界将正常工作,使所有匹配的数字前面都有另一个单词char。
答案 1 :(得分:1)
单词边界锚(\b
)匹配单词字符(字母,数字或下划线)与非单词字符之间的过渡,反之亦然。 -13:21
中没有此类转换。
单词边界锚点可以保持在符号和小时之间,以避免在与时间(65401:23
)相似的表达式中进行匹配,但不能阻止它与654:01:23
或{{1}匹配}。
作为旁注,654-01:23
只是写出[\-\+]
的一种令人费解的方式。 [-+]
在字符类中没有任何特殊含义,没有必要转义它。 +
是字符类中的特殊字符,但不是第一个或最后一个字符(即-
或[-
)。
另一个评论:您在-]
中同时使用[0-9]
和\d
。它们表示同样的事情 1 但是,为了便于阅读,建议只遵守一个惯例。由于使用了仅包含数字的其他字符类,因此我会使用regex
而不是[0-9]
。
正则表达式片段中的一些错误持续数小时:\d
与2[1-3]|[01][0-9]|[1-9]
不匹配(但它匹配0
)和00
。
鉴于上述所有更正和改进,20
应为:
regex
未设置Unicode标志时, 1 (?<sign>[-+]?)\b(?<hours>2[0-3]|[01][0-9]|[0-9]):(?<minutes>[0-5][0-9])\b
与\d
相同。启用Unicode后,[0-9]
也会匹配非基于拉丁语的字母表中的数字。