【问题标题】:Regex with allowing missing characters允许缺少字符的正则表达式
【发布时间】:2017-11-30 16:55:06
【问题描述】:

我正在尝试找到一种方法来确定一个字符串是否包含至少 n 个特定顺序的字符。

我正在处理大量手写的数据,而且拼写错误非常多。

我需要在一个看起来像这样的大字符串中找到文本部分:

不相关的文字 MONKEY、CHIMP:更不相关的文字

我需要找到MONKEY,CHIMP:

这种输入错误的方式非常疯狂。这是一个更奇怪的例子:

猴子,CHIMP:

我已经在我的正则表达式中找到了能够找到所有这些事件的地方。可能不是最好的解决方案,但它是:

 (m|M)(o|O)(n|N)(k|K)(e|E)(y|Y),?\s+(c|C)(h|H)(i|I)(m|M)(p|P)(\s+)?:

看起来有点奇怪,但确实有效。

不幸的是,怪异并不止于此。我需要修改这个正则表达式,以便它还允许每个单词中缺少 1 个字母。

所以我需要修改这个正则表达式,这样它也适用于:

猴子,CIMp:

onKEY,芯片:

onKEY , CIMp :

我认为应该有一种方法可以告诉正则表达式它应该需要 wordlength-1 确切的字符数才能匹配。

有没有简单的方法来做到这一点?

我一直在研究 {4, },但我不确定这是正确的方向,或者是否可以在这里应用。

提前致谢, 彼得

【问题讨论】:

  • 如果您将文本标准化为小写,则可以使正则表达式更容易。
  • 或者通过不区分大小写的匹配。见stackoverflow.com/questions/3436118/…
  • 单独的正则表达式可能不足以实现可扩展的解决方案。您可能最终需要自己的解析器评估与字典单词的相似性,例如使用 Levenshtein 距离度量。
  • 您是否考虑过使用比正则表达式更高级的算法?例如。 commons.apache.org/proper/commons-text/jacoco/…
  • 这对正则表达式来说太可怕了(它太长了)。你应该改用Fuzzy text search

标签: java regex string


【解决方案1】:

使用纯正则表达式,最好的办法是(添加空格以提高可读性):

/
  ^
  (
    monkey\s*,?\s*chimp\s*:
  |
    onkey\s*,?\s*chimp\s*:
  |
    mnkey\s*,?\s*chimp\s*:
  |
    ...
  )
  $
/ix

但是,这是一种非常冗长的方法,仍然无法解决各种其他模糊匹配,例如 "Monkey, Chinp:""Monkey; Chimp:"


您可以采取的另一种方法是首先检查字符串的长度:

/^\w{10,15}$/

and then 对其进行一些非常模糊的匹配:

/m?o?n?k?e?y?\s*,?\s*c?h?i?m?p?\s*:/i

但是,您需要在这里小心,因为匹配列表中可能包含一些奇怪的结果,例如:

"mon      c:"

我建议采用不同的非正则表达式方法来利用 Levenshtein Distance 库。这将允许您在“字符串与 Monkey, Chimp 匹配的程度上设置通用边界

【讨论】:

    【解决方案2】:

    ^\w{10,10}$ # 允许正好 10 个字符的单词。将其设置为长度 - 1。 然后将每个字符设为可选。

    我认为只有 {10} 也可以。

    【讨论】:

    • 你可以写\w{10};无需建议\w{10,10}。但是,这并不能解决 OP 的问题:他们想要一个也匹配的模式,例如 "MonKEY , CIMp" - 这是 13 个字符。
    • 这就是我写的原因,然后每个字符都应该是可选的。这样就可以省略了。
    【解决方案3】:

    你可以像这样使用正则表达式,这不是很漂亮但是你的例子也很奇怪

    第一个用例不区分大小写:(https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#CASE_INSENSITIVE)

    我不知道一种治疗的解决方案,但您可以先检查"m?o?n?k?e?y?\s+,?\s+c?h?i?m?p?(\s+)?:",然后在另一个测试中检查长度,这很容易

    【讨论】:

    • 那么像mon , p这样模糊的东西会匹配吗?对我来说听起来不太可靠......
    • @TomLord 首先感谢您提供如此建设性和有用的评论。然后我写了你可能会添加一个长度测试,如果需要的话,我只是添加结构,顺序和可能有更少的字母,如果你有更好的主意,只需点击蓝色按钮,称为“发布你的答案”
    • StackOverflow 已经截断了我的评论,所以你可能因为格式而误解了。逗号两边应该有 几个 空格 - 所以长度检查仍然会通过。你也可以在下面看到my answer
    猜你喜欢
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    相关资源
    最近更新 更多