我正在尝试使用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]
实际上有一个完全不同的含义——它指的是退格,而不是单词边界。
这是一个工作演示。