所以我有这样的事情:
\ 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)
在开始时应该是一个积极的观察,以确保数字前面有数字,数字后面有正数预测,以确保跟随它的情况相同。
这样做的正确方法是什么?
答案 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])