【发布时间】:2012-12-03 00:31:35
【问题描述】:
我找不到匹配重复字母的正则表达式。我的问题是我想使用正则表达式来过滤垃圾邮件,例如,我想使用正则表达式来检测这些字符串中的“垃圾邮件”和“伟哥”: "xxxSpAmyyy", "xxxSPAMyyy", "xxxvI 一个 Gr AA yyy", "xxxV iiA gR a xxx"
您对我如何以一种好的方式做到这一点有什么建议吗?
【问题讨论】:
-
到目前为止你有没有尝试过?
我找不到匹配重复字母的正则表达式。我的问题是我想使用正则表达式来过滤垃圾邮件,例如,我想使用正则表达式来检测这些字符串中的“垃圾邮件”和“伟哥”: "xxxSpAmyyy", "xxxSPAMyyy", "xxxvI 一个 Gr AA yyy", "xxxV iiA gR a xxx"
您对我如何以一种好的方式做到这一点有什么建议吗?
【问题讨论】:
这会忽略大小写,无论它们是一个挨一个,还是它们之间有其他字符
"(?i).{0,}v.{0,}i.{0,}a.{0,}g.{0,}r.{0,}a.{0,}"
如果你知道字母之间可以有多少个字符,你可以输入.{0,max_distance}而不是.{0,}
更新:
它甚至适用于重复,因为我已经尝试过了:
String str = "xxxV iiA gR a xxx";
if(str.matches("(?i).{0,}v.{0,}i.{0,}a.{0,}g.{0,}r.{0,}a.{0,}")){
System.out.println("Yes");
}
else{
System.out.println("No");
}
这打印Yes
【讨论】:
我想,你走错路了。垃圾邮件的过滤与机器学习密切相关。我建议你阅读一下Bayesian spam filtering。
如果您认为您会收到拼写错误的垃圾邮件(以及其他类型的垃圾) - 我建议您不要使用基于整个单词的过滤,而是基于 n-grams .
【讨论】:
喜欢搜索这个?
"v.{0,3}i.{0,3}a.{0,3}g.{0,3}r.{0,3}a"
代码:
这会在字符之间留出 0 到 3 个字符的空间。我没有编译以下内容, 但它“应该有效。”
String[] strings = new String[] { ""xxxV iiA gR a xxx"" };
final Pattern spamPattern = makePattern("viagra");
for (String s : strings) {
boolean isSpam = spamPattern.matcher(s).find();
if (isSpam) {
System.out.println("Spam: " + s);
}
}
...
Pattern makePattern(String cusWord) {
cusWord = cusWord.toLowerCase();
StringBuilder sb = new StringBuilder();
sb.append("(?i)"); // Case-insensitive setting.
for (int i = 0; i < cusWord.length(); ) {
int cp = cusWord.codePointAt(i);
i += Character.charCount(cp);
if ('o' == cp) {
sb.append("[o0]");
} else if ('l' == cp) {
sb.append("[l1]");
} else {
sb.appendCodePoint(cp);
}
sb.append(".{0,3}"); // 0 - 3 occurrences of any char.
}
return Pattern.compile(sb.toString());
}
【讨论】:
你可以试试positive look-aheads
(?=.*v)(?=.*i)(?=.*a)(?=.*g)(?=.*r)(?=.*a).*
编辑:
(?=.*v.*i.*a.*g.*r.*a.*).*
【讨论】:
你尝试过任何正则表达式吗?
\w*[sSpPaAmM]+\w* 之类的东西应该可以解决问题
您可以在此站点上测试您的 RE:http://www.regexplanet.com/advanced/java/index.html
【讨论】: