我有以下代码。我需要检查一些禁止词列表中现有的任何单词的文本。但即使文本中存在这个词,匹配器也看不到它。这是代码:
final ArrayList<String> regexps = config.getProperty(property);
for (String regexp: regexps){
Pattern pt = Pattern.compile("(" + regexp + ")", Pattern.CASE_INSENSITIVE);
Matcher mt = pt.matcher(plainText);
if (mt.find()){
result = result + "message can't be processed because it doesn't satisfy the rule " + property;
reason = false;
System.out.println("reason" + mt.group() + regexp);
}
}
有什么问题?此代码无法在в[ыy][шs]лит[еe]
中找到regexp
的正则表达式plainText = "Вышлите пожалуйста новый счет на оплату на Санг, пока согласовывали, уже
прошли его сроки. Лиценз..."
。我还尝试了regexp
的另一种变体,但一切都没用了
答案 0 :(得分:1)
问题出在其他地方。
import java.util.regex.*;
public class HelloWorld {
public static void main(String []args) {
Pattern pt = Pattern.compile("(qwer)");
Matcher mt = pt.matcher("asdf qwer zxcv");
System.out.println(mt.find());
}
}
这打印出来是真的。但是,您可能希望使用单词边界作为分隔符:
import java.util.regex.*;
public class HelloWorld {
public static void main(String []args) {
Pattern pt = Pattern.compile("\\bqwer\\b");
Matcher mt = pt.matcher("asdf qwer zxcv");
System.out.println(mt.find());
mt = pt.matcher("asdfqwer zxcv");
System.out.println(mt.find());
}
}
除非您需要捕获组中的关键字,否则括号将无用。但是你已经开始使用它了。
答案 1 :(得分:0)
使用ArrayList的内置函数indexOf(Object o)
和contains(Object o)
来检查String中的String是否存在于何处。
e.g。
ArrayList<String> keywords = new ArrayList<String>();
keywords.add("hello");
System.out.println(keywords.contains("hello"));
System.out.println(keywords.indexOf("hello"));
输出:
真正
0
答案 2 :(得分:0)
尝试使用以下使用OR
运算符的正则表达式过滤掉包含禁止词的邮件。
private static void findBannedWords() {
final ArrayList<String> keywords = new ArrayList<String>();
keywords.add("f$%k");
keywords.add("s!@t");
keywords.add("a$s");
String input = "what the f$%k";
String bannedRegex = "";
for (String keyword: keywords){
bannedRegex = bannedRegex + ".*" + keyword + ".*" + "|";
}
Pattern pt = Pattern.compile(bannedRegex.substring(0, bannedRegex.length()-1));
Matcher mt = pt.matcher(input);
if (mt.matches()) {
System.out.println("message can't be processed because it doesn't satisfy the rule ");
}
}