我试图找到一种方法来确定字符串是否包含特定顺序中至少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,}但我不确定这是正确的方向,还是可以在这里应用。
提前感谢, 彼得
答案 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+)?:"
,然后再检查另一次检查的长度,这很容易