java - 构建正则表达式来捕获单词

标签 java regex string

几天来我一直在尝试解决这个问题,只是看不出它有什么问题。

该函数的想法是捕获垃圾邮件,因此它将要检查的电子邮件和包含要检查的单词的字符串数组作为参数,并根据所有单词构建正则表达式。然后使用构建的正则表达式字符串检查电子邮件的正文和主题是否包含任何单词,如果包含,则不应发布它。

它捕获我尝试过的垃圾邮件,但它也捕获所有其他邮件。

private boolean isSpam(Mail mail, String[] filter){
    StringBuilder sb = new StringBuilder();

    // Build the regex String for each string in filter
    for(int i=0;i<filter.length;i++){
        sb.append("(?i).*");
        for(int ii = 0;ii<filter[i].length();ii++){
            sb.append("[" + filter[i].charAt(ii) + "\\s]*"); // [x\\s]*; x = current letter
        }
        filter[i] = sb.toString();
        sb.delete(0, sb.length());
    }

    for(int i=0;i<filter.length;i++){
        if(mail.getSubject().matches(filter[i]) ||  mail.getMessage().matches(filter[i])){
            return true;
        }
    }
    return false;
}

ex 的正则表达式字符串。 垃圾邮件看起来像:(?i).[s\\s][p\\s][a\\s][m\\s]*

最佳答案

当您编写 (?i).* 时,它会匹配出现零次或多次的每个字符(不区分大小写)。

丢失 .* .

现在,如果过滤器中的第一个字符串是垃圾邮件,并且您有单词 s am,它将匹配它,因为您的正则表达式为 (?i)[s\s][p\s][a\s] [m\s]。因此它会查找 s 和 a 之间是否出现 p 或空白。

所以丢掉\s。

每个字符末尾的 * 表明您正在查找出现 0 次或多次的正则表达式。因此,即使该单词不存在,它也会返回 true。

所以, (?i)[s\s]* [p\s]* [a\s]* [m\s]* 意味着您希望该单词匹配,即使它出现 0 次或多次s 后跟 0 次或多次出现的 p,后跟 0 次或多次出现的 a,后跟 0 次或多次出现的 m。

所以丢掉*

最后,您的正则表达式应该匹配包含该词的每封邮件中的垃圾邮件一词,

(?i)[s][p][a][m] -- 不区分大小写 s 后跟 p 后跟 a 后跟 m

了解更多 here

编辑

也许这符合要求。

(?i).*[s]+[\\s]*[p]+[\\s]*[a]+[\\s]*[m]+[\\s]*.*

关于java - 构建正则表达式来捕获单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20103784/

相关文章:

java - 如何断言 TestNG java 没有抛出异常

c# - 正则表达式替换不属于十六进制颜色值且后面没有特定字符串的十进制数

MySql 用正则表达式替换和更新列内容?

c++ - 子串,中间抓一 block ,大小随机

C - 加载包含指向指针的指针的结构

java - Android:无法加载系统库

java - 在java mvc中共享模型对象

java - 使用自引用类型时 java 泛型方法中的绑定(bind)不匹配错误

java - 从项目中提取数据的最佳方法

javascript - 将变量与测试字符串进行比较