字边界上的正则表达式匹配或非数字

时间:2014-04-10 16:17:57

标签: regex word-boundary word-boundaries

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

对我来说,显而易见的模式是:

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

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

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

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

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

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

有没有人知道我可以使用什么作为一个表达式来提取“123”的源字符串情况,如:

"abc123def"

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

2 个答案:

答案 0 :(得分:9)

您应该对这些案例使用外观:

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

这意味着匹配3个未跟随且前面有数字的数字。

Working Demo

答案 1 :(得分:3)

Lookarounds可以解决这个问题,但我个人试图避免它们,因为并非所有正则表达式引擎都完全支持它们。另外,我不会说这个问题很复杂,一开始就值得使用外观。

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

然后返回:\1

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

然后替换为:\1

作为旁注,\b作为字符类的一部分工作的原因是因为在括号内,[\b]实际上具有完全不同的含义 - 它指的是退格,而不是单词边界。

这里是Working Demo