为什么正则表达式组中未捕获特殊字符

时间:2017-09-28 10:18:08

标签: regex

我有以下正则表达式来捕获正面&负时间偏移。

\b(?<sign>[\-\+]?)(?<hours>2[1-3]|[01][0-9]|[1-9]):(?<minutes>[0-5]\d)\b

匹配正常但前导符号不会出现在捕获组中。我格式化错了吗? 您可以在此处查看效果https://regex101.com/r/CQxL8q/1/

2 个答案:

答案 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]

正则表达式片段中的一些错误持续数小时:\d2[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]也会匹配非基于拉丁语的字母表中的数字。