2012-12-30 42 views
0

所以我有这样的事情:正则表达式 - 匹配号码范围,周围有没有号码

\ B(0 [1-9] | [1-2] [0-9] | 3 [ 0-6])\ b

对于只匹配数字1-36,它工作正常。但是我可能会得到像S36这样的东西,它不会匹配。我不能在数字的任何一边假设一个干净的单词边界。

我想拥有它,所以它会用除了两边其他任何数字匹配1-36。

我觉得像这样的工作,但它并不:

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

这应该是一个积极的向后看的开始,以确保有是什么,但数量和积极的前瞻后前位数字以确保它跟随它一样。

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

+1

什么正则表达式引擎?所有的口味都不支持向后看,甚至向前看。 – Lucero

+0

我在.NET中这样做,但使用免费软件Expresso进行测试。 – lintmouse

回答

1

如果您的引擎不支持回顾后/超前,那么你仍然可以只匹配包括非数字的整个事情,并选择您感兴趣的捕获。

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

你的结果会是在这个例子中的捕获1中(“外部”匹配在非捕获组中)。

注意使用.NET,你有回顾后先行和全面支持,使下面应该工作:

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

本品采用消极而不是积极环视环视。否则,位于字符串开头或末尾的数字将不匹配,因为在没有字符的情况下需要使用非数字字符,导致不匹配。

+0

好的,.NET的完美工作。谢谢! – lintmouse

+0

我只是做了一个小的编辑,将大括号加回去,否则在任何情况下都无法使用。对于那个很抱歉。 – Lucero

1

你可以使用[^ 0-9]在开始和结束,然后通过(第二次在这种情况下)看在适当的拍摄组获得数:

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

感谢您的回复。就两边不匹配的数字而言,这正是我想要的 - 但它也匹配非数字。所以,如果我把字符串S36,它匹配S36,而不是只有36 ... – lintmouse

+1

@垃圾。 _“,然后通过查看合适的捕获组(在本例中为第二个)来获得数字”_“。的Javascript?例如:''S36'.replace(/(^ | [^ 0-9])(0 [1-9] | [1-2] [0-9] | 3 [0-6])($ | [^ 0-9])/,'$ 2')'第二个捕获的组是'$ 2',所以结果是'36'。 – MikeM

+0

好吧,我的坏。谢谢。 – lintmouse

相关问题