允许缺少字符的正则表达式

时间:2017-06-27 14:59:16

标签: java regex string

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

我正在处理手工编写的大量数据,错别字的数量非常疯狂。

我需要在大字符串中找到类似的文本部分:

  

不相关的文字MONKEY,CHIMP:更无关紧要的文字

我需要找到 MONKEY,CHIMP:

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

  

MonKEY,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+)?:

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

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

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

  

MonKEY,CIMp:

     

onKEY,ChIMp:

     

onKEY,CIMp:

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

有一种简单的方法吗?

我一直在调查{4,}但我不确定这是正确的方向,还是可以在这里应用。

提前感谢, 彼得

3 个答案:

答案 0 :(得分:1)

使用纯正则表达式,那么你最好能做的就是(添加空白以便于阅读):

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

然而,这是一个非常冗长的方法,仍然不会考虑各种其他模糊匹配,如"Monkey, Chinp:""Monkey; Chimp:"

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

/^\w{10,15}$/

然后对它执行一些非常模糊的匹配:

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

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

"mon      c:"

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

首先使用不区分大小写:(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+)?:",然后再检查另一次检查的长度,这很容易