正则表达式 - 匹配编号范围,周围没有数字

时间:2012-12-30 16:05:35

标签: regex lookahead lookbehind digit

所以我有这样的事情:

  

\ B(0 [1-9] | [1-2] [0-9] | 3 [0-6])\ B'/ P>

仅适用于匹配数字1-36的情况。但是我可能得到类似S36的东西,这些东西不会匹配。我不能假设数字两边都有一个干净的字边界。

我想拥有它所以除了1-36以外的任何东西都要匹配。

我认为这样的事情会奏效,但事实并非如此:

  

(小于?= \ d)(?0 [1-9] | [1-2] [0-9] | 3 [0-6])(?= \ d)

在开始时应该是一个积极的观察,以确保数字前面有数字,数字后面有正数预测,以确保跟随它的情况相同。

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

如果你的引擎不支持lookbehind / lookahead,那么你仍然可以匹配整个事物,包括非数字,并选择你感兴趣的捕获。

(?:^|[^1-9])(0?[1-9]|[1-2][0-9]|3[0-6])(?:$|[^1-9])

在此示例中,您的结果将位于捕获1中(“外部”匹配位于非捕获组中)。

请注意,对于.NET,您确实完全支持lookbehind和lookahead,因此以下内容应该有效:

(?<![0-9])(?:0?[1-9]|[1-2][0-9]|3[0-6])(?![0-9])

这使用消极的外观而不是积极的外观。否则,字符串开头或结尾的数字将不匹配,因为在没有字符的情况下需要非数字字符,从而导致不匹配。

答案 1 :(得分:1)

您可以在开头和结尾使用[^ 0-9],然后通过查看相应的捕获组(在本例中为第二个)来获取数字:

(^|[^0-9])(0?[1-9]|[1-2][0-9]|3[0-6])($|[^0-9])