我正在尝试使用正则表达式模式(在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人员。
答案 0 :(得分:9)
答案 1 :(得分:3)
Lookarounds可以解决这个问题,但我个人试图避免它们,因为并非所有正则表达式引擎都完全支持它们。另外,我不会说这个问题很复杂,一开始就值得使用外观。
您可以匹配:(?:\b|\D)(\d{3})(?:\b|\D)
然后返回:\1
或者,如果您正在执行替换并需要匹配整个字符串:(?:\b|\D)+(\d{3})(?:\b|\D)+
然后替换为:\1
作为旁注,\b
作为字符类的一部分工作的原因是因为在括号内,[\b]
实际上具有完全不同的含义 - 它指的是退格,而不是单词边界。
这里是Working Demo。