【问题标题】:Java regular expression for repeated letters重复字母的Java正则表达式
【发布时间】:2012-12-03 00:31:35
【问题描述】:

我找不到匹配重复字母的正则表达式。我的问题是我想使用正则表达式来过滤垃圾邮件,例如,我想使用正则表达式来检测这些字符串中的“垃圾邮件”和“伟哥”: "xxxSpAmyyy", "xxxSPAMyyy", "xxxvI 一个 Gr AA yyy", "xxxV iiA gR a xxx"

您对我如何以一种好的方式做到这一点有什么建议吗?

【问题讨论】:

  • 到目前为止你有没有尝试过?

标签: java regex


【解决方案1】:

这会忽略大小写,无论它们是一个挨一个,还是它们之间有其他字符

"(?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

【讨论】:

  • 我试过这个,当字符串中有一个或多个字母重复时它不起作用,因为最后一个字符串有(“ii”)。但这是迄今为止最好的建议。
  • 是的,对不起。我的错误是我尝试使用 max_distance = 5,它太小了,当 max_distnce > 5 时它可以工作!例如,我认为这是“v”和“i”之间的距离,而不是单词的长度。
【解决方案2】:

我想,你走错路了。垃圾邮件的过滤与机器学习密切相关。我建议你阅读一下Bayesian spam filtering

如果您认为您会收到拼写错误的垃圾邮件(以及其他类型的垃圾) - 我建议您不要使用基于整个单词的过滤,而是基于 n-grams .

【讨论】:

  • 这只是一个例子,我需要正则表达式来匹配这些类型的文本,垃圾邮件过滤器不需要,但感谢您的输入。
【解决方案3】:

喜欢搜索这个?

"v.{0,3}i.{0,3}a.{0,3}g.{0,3}r.{0,3}a"

Pattern


代码:

这会在字符之间留出 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());
}

【讨论】:

  • 我试过这个,当字符串中有一个或多个字母重复时不起作用,因为最后一个字符串有(“ii”)。
  • makePattern 方法很棒!我已经尝试过了,它工作正常,即使在更高级的字符串上,比如“afdkV i AA ggggxRrR aAqwofv”。但我不明白“0-3次出现”不应该是1-3吗?
  • "Viagra" 因此匹配为 0 个其他字符介于两者之间。
【解决方案4】:

你可以试试positive look-aheads

(?=.*v)(?=.*i)(?=.*a)(?=.*g)(?=.*r)(?=.*a).*

编辑:

(?=.*v.*i.*a.*g.*r.*a.*).*

【讨论】:

  • 你有不匹配字符串的例子吗?
【解决方案5】:

你尝试过任何正则表达式吗?

\w*[sSpPaAmM]+\w* 之类的东西应该可以解决问题

您可以在此站点上测试您的 RE:http://www.regexplanet.com/advanced/java/index.html

【讨论】:

  • 我现在已经试过了,当字符串中有一个或多个字母的重复时它不起作用,因为最后一个字符串有(“ii”),与其他语法有同样的问题,埃根先生建议的。
猜你喜欢
  • 2018-04-09
  • 2013-06-03
  • 2013-09-27
  • 1970-01-01
  • 2015-03-26
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
相关资源
最近更新 更多