单词边界上的Regex匹配或非数字



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

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

"b(d{3})b"

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

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

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

我本以为解决方案是添加一个同时包括非数字(\D)和单词边界(\b)的字符类。但这似乎是非法的语法。

"[bD](d{3})[bD]"

有人知道我可以用什么表达式来提取"123"作为源字符串的情况吗,比如:

"abc123def"

如果有任何帮助,我将不胜感激。是的,我意识到在Java中,必须对\b到\b这样的代码进行双重转义,但这不是我的问题,我不想把它局限于Java用户。

您应该对这些情况使用查找:

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

这意味着匹配3个后面没有数字的数字。

工作演示

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

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

然后返回:1

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

然后替换为:1

顺便说一句,b不能作为字符类的一部分工作的原因是,在括号内,[b]实际上有一个完全不同的含义——它指的是退格,而不是单词边界。

这是一个工作演示。

相关内容

  • 没有找到相关文章

最新更新