1

所以我有这样的事情:

\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)

它应该在开始时进行积极的向后看,以确保在数字之前除了数字之外没有任何东西,在数字之后进行积极的向前看,以确保在它之后也是如此。

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

4

2 回答 2

2

如果您的引擎不支持后视/前瞻,那么您仍然可以匹配包括非数字在内的整个内容并选择您感兴趣的捕获。

(?:^|[^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])

这使用负环视而不是正环视。否则,字符串开头或结尾的数字将不匹配,因为在没有字符的地方需要非数字字符,导致不匹配。

于 2012-12-30T16:10:13.050 回答
1

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

(^|[^0-9])(0?[1-9]|[1-2][0-9]|3[0-6])($|[^0-9])
于 2012-12-30T16:10:44.710 回答