5

我正在尝试使用 Regex 模式(在 Java 中)来查找 3 位数字的序列,并且连续只有 3 位数字。4位不匹配,2位不匹配。

对我来说明显的模式是:

"\b(\d{3})\b"

这与许多源字符串案例相匹配,例如:

">123<"
" 123-"
"123"

但它不会与“abc123def”的源字符串匹配,因为 c/1 边界和 3/d 边界不算作 \b 类所期望的“单词边界”匹配。

我本来希望解决方案是添加一个包含非数字 (\D) 和单词边界 (\b) 的字符类。但这似乎是非法的语法。

"[\b\D](\d{3})[\b\D]"

有谁知道我可以使用什么表达式来为源字符串情况提取“123”,例如:

"abc123def"

我会很感激任何帮助。是的,我意识到在 Java 中必须将 \b 之类的代码双重转义为 \b,但这不是我的问题,我不想将其限制为 Java 人员。

4

2 回答 2

11

对于这些情况,您应该使用环视:

(?<!\d)(\d{3})(?!\d)

这意味着匹配 3 个数字,它们后面和前面都没有数字。

工作演示

于 2014-04-10T16:21:54.500 回答
4

Lookarounds 可以解决这个问题,但我个人尽量避免使用它们,因为并非所有正则表达式引擎都完全支持它们。此外,我不会说这个问题很复杂,首先值得使用环视。

你可以匹配这个:(?:\b|\D)(\d{3})(?:\b|\D)

然后返回:\1

或者,如果您正在执行替换并且需要匹配整个字符串:(?:\b|\D)+(\d{3})(?:\b|\D)+

然后替换为:\1

附带说明一下,之所以\b不能作为字符类的一部分工作,是因为在括号内,[\b]实际上具有完全不同的含义-它指的是退格,而不是单词边界。

这是一个工作演示

于 2014-04-10T17:08:20.270 回答