我正在寻找如下替换java字符串值。下面的代码不起作用。
cleanInst.replaceAll("[<i>]", "");
cleanInst.replaceAll("[</i>]", "");
cleanInst.replaceAll("[//]", "/");
cleanInst.replaceAll("[\bPhysics Dept.\b]", "Physics Department");
cleanInst.replaceAll("[\b/n\b]", ";");
cleanInst.replaceAll("[\bDEPT\b]", "The Department");
cleanInst.replaceAll("[\bDEPT.\b]", "The Department");
cleanInst.replaceAll("[\bThe Dept.\b]", "The Department");
cleanInst.replaceAll("[\bthe dept.\b]", "The Department");
cleanInst.replaceAll("[\bThe Dept\b]", "The Department");
cleanInst.replaceAll("[\bthe dept\b]", "The Department");
cleanInst.replaceAll("[\bDept.\b]", "The Department");
cleanInst.replaceAll("[\bdept.\b]", "The Department");
cleanInst.replaceAll("[\bdept\b]", "The Department");
实现上述替换的最简单方法是什么?
答案 0 :(得分:13)
如果它是您正在使用的功能,则存在问题。每次调用都会再次编译每个正则表达式。最好将它们创建为常量。你可以有这样的东西。
private static final Pattern[] patterns = {
Pattern.compile("</?i>"),
Pattern.compile("//"),
// Others
};
private static final String[] replacements = {
"",
"/",
// Others
};
public static String cleanString(String str) {
for (int i = 0; i < patterns.length; i++) {
str = patterns[i].matcher(str).replaceAll(replacements[i]);
}
return str;
}
答案 1 :(得分:7)
cleanInst.replaceAll("[<i>]", "");
应该是:
cleanInst = cleanInst.replaceAll("[<i>]", "");
因为String
类是不可变的并且不会更改其内部状态,即replaceAll()
返回与cleanInst
不同的新实例。
答案 2 :(得分:3)
您应该阅读基本的regular expressions tutorial。
在此之前,您尝试做的事情可以这样做:
cleanInst = cleanInst.replace("//", "/");
cleanInst = cleanInst.replaceAll("</?i>", "");
cleanInst = cleanInst.replaceAll("/n\\b", ";")
cleanInst = cleanInst.replaceAll("\\bPhysics Dept\\.", "Physics Department");
cleanInst = cleanInst.replaceAll("(?i)\\b(?:the )?dept\\b\\.?", "The Department");
你可能链接所有那些替换操作(但我不知道正确的Java语法)。
关于word boundaries:\b
通常只在字母数字字符之前或之后才有意义。
例如,\b/n\b
只会匹配/n
,如果它前面有一个字母数字字符,后面跟一个非字母数字字符,那么它匹配"a/n!"
但不匹配"foo /n bar"
}。