我正在尝试审查我的应用程序中的特定字符串和模式,但我的匹配器在搜索模式时似乎没有找到任何结果。
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. "
答案 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(".","*")
类中的appendReplacement
和appendTail
方法。以下是使用它的代码应该如何
Matcher