要回答您最初的问题:是的,您可以这样做,而且如果您在循环中多次应用相同的正则表达式,它确实会比您的原始代码更快。你的循环应该这样重写:
Pattern p1 = Pattern.compile("REGEX1");
Pattern p1 = Pattern.compile("REGEX1");
while (scan.hasNextLine()) {
String myWorkLine = scan.readLine();
myWorkLine = p1.matcher(myWorkLine).replaceAll("replacement1");
myWorkLine = p2.matcher(myWorkLine).replaceAll("replacement2");
...;
}
但是,如果您没有使用正则表达式,正如您的第一个示例所建议的 ( "<tag1>"
),那么请不要使用String.replaceAll(String regex, String replacement)
,因为正则表达式会更慢。而是使用String.replace(CharSequence target, CharSequence replacement)
, 因为它不适用于正则表达式并且速度更快。
例子:
"ABAP is fun! ABAP ABAP ABAP".replace("ABAP", "Java");
请参阅:String.replace 的 Java 文档
从根本上改变您的问题并不好,但是好的,这里再次为您的正则表达式提供答案:
String s1
= "You can <bold>have nice weather</bold>, but <bold>not</bold> always!";
//EDIT: the regex was 'overengineered', and .?? should have been .*?
//String s2 = s1.replaceAll("(.*?)<bold>(.*?)</bold>(.??)", "$1{$2}$3");
String s2 = s1.replaceAll("<bold>(.*?)</bold>", "{$1}");
System.out.println(s2);
输出:You can {have nice weather}, but {not} always!
这是带有这个新正则表达式的循环,是的,这将比原始循环更快:
//EDIT: the regex was 'overengineered'
Pattern p = Pattern.compile("<bold>(.*?)</bold>");
while (scan.hasNextLine()) {
String myWorkLine = scan.readLine();
myWorkLine = p.matcher(myWorkLine).replaceAll("{$1}");
...;
}
编辑:
这里是Java RegEx 语法结构的描述