【问题标题】:Regex matching on word boundary OR non-digit单词边界或非数字上的正则表达式匹配
【发布时间】:2014-05-24 11:37:32
【问题描述】:

我正在尝试使用 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 人员。

【问题讨论】:

标签: regex word-boundary word-boundaries


【解决方案1】:

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

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

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

Working Demo

【讨论】:

    【解决方案2】:

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

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

    然后返回:\1

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

    然后替换为:\1

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

    这是Working Demo

    【讨论】:

    • 这是一个很好的答案。奇怪的是,我试过了,但在单元测试中空手而归。我一定是以某种方式把它搞砸了。我再试一次。谢谢!
    • 抱歉,需要稍作修改。第二个模式需要使用+而不是*,否则它将匹配一个四位或更多位字符串的前三位。
    • 是的 - 我遇到了这个问题,因为我实际上是在我的应用程序中进行替换。感谢您的更新。
    猜你喜欢
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    相关资源
    最近更新 更多