如何使以下正则表达式与我的审查员匹配? Java的

时间:2014-02-01 17:26:01

标签: java regex matcher

我正在尝试审查我的应用程序中的特定字符串和模式,但我的匹配器在搜索模式时似乎没有找到任何结果。

public String censorString(String s) {
        System.out.println("Censoring... "+ s);
        if (findPatterns(s)) {
            System.out.println("Found pattern");
            for (String censor : foundPatterns) {
                for (int i = 0; i < censor.length(); i++) 
                    s.replace(censor.charAt(i), (char)42);
            }
        }
        return s;
    }

    public boolean findPatterns(String s) {
        for (String censor : censoredWords) {
            Pattern p = Pattern.compile("(.*)["+censor+"](.*)");//regex
            Matcher m = p.matcher(s);
            while (m.find()) {
                foundPatterns.add(censor);
                return true;
            }
        }
        return false;
    }

目前我只专注于一种模式,如果在字符串中找到了审查员。我尝试了很多组合,但似乎都没有回归“真实”。

"(.*)["+censor+"](.*)"
"(.*)["+censor+"]"
"["+censor+"]"
"["+censor+"]+"

任何帮助都将不胜感激。

用法:我的审查词是“你好”,“再见”

String s = "hello there, today is a fine day."
System.out.println(censorString(s));

应打印" ***** today is a fine day. "

2 个答案:

答案 0 :(得分:0)

你的正则表达是对的!!!!问题出在这里。

s.replace(censor.charAt(i), (char)42);

如果您希望此行重写字符串的删失部分,则不会。请查看java doc for string。

请在下面找到可以执行您要执行的操作的程序。我删除了你的findpattern方法,并在String API中使用了replaceall和regex。希望这会有所帮助。

公共类Regex_SO {

private String[] censoredWords = new String[]{"hello"};

 /**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    Regex_SO regex_SO = new Regex_SO();
    regex_SO.censorString("hello there, today is a fine day. hello again");
}

public String censorString(String s) {
    System.out.println("Censoring... "+ s);

    for(String censoredWord : censoredWords){
        String replaceStr = "";
        for(int index = 0; index < censoredWord.length();index++){
            replaceStr = replaceStr + "*";
        }

       s =  s.replaceAll(censoredWord, replaceStr);
    }
    System.out.println("Censored String is .. " + s);
    return s;
}

}

答案 1 :(得分:0)

因为这看起来像家庭作业我不能给你工作代码,但这里有几个指针

  • 考虑使用\\b(word1|word2|word3)\\b正则表达式来查找特定字词
  • 创建代表char的{​​{1}},您可以将其写为*。请勿使用'*'来避免magic numbers
  • 创建新字符串,其长度与旧字符串相同,但只会填充您可以使用的特定字符(char)42
  • 要使用新值替换即时创建的匹配,您可以使用String newString = oldString.replaceAll(".","*")类中的appendReplacementappendTail方法。以下是使用它的代码应该如何

    Matcher