此代码可以正常工作:
final String result = myString.replaceAll("<tag1>", "{").replaceAll("<tag2>", "}");
但是我必须解析大文件,所以我问我是否可以在Pattern.compile("REGEX");
之前找到while
:
Patter p = Pattern.compile("REGEX");
while(scan.hasNextLine()){
final String myWorkLine = scan.readLine();
p.matcher(s).replaceAll("$1"); // or other value
..;
}
我期望更快的结果,因为正则表达式编译是maid一次且只有一次。
修改的
我想在模式中放置(如果可能)replaceAll(..).replaceAll(..)
模型,并tag1
==&gt; {
和tag2
==&gt ; }
问题:外部循环 Pattern
模型比内循环 replaceAll.replaceAll
模型更快?
答案 0 :(得分:2)
回答你的原始问题:是的,如果你在循环中多次应用相同的正则表达式,那么你可以做到这一点,并且确实会比原始代码更快。你的循环应该像这样重写:
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");
请参阅:Java Docs for String.replace
从根本上改变你的问题并不好,但是好的,这里再次回答你的正则表达式:
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 syntax constructs
答案 1 :(得分:1)
replaceAll
使用正则表达式模式。来自java.lang.String source code:
public String replaceAll(String regex, String replacement) {
return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}
编辑1:请停止更改您要求的内容。选择一个问题并坚持下去。
<强> EDIT2:强>
如果您确实想要这样做,那么在循环之外编译正则表达式,在最简单的情况下,您需要两种不同的模式:
Pattern tag1Pattern = Pattern.compile("<tag1>");
Pattern tag2Pattern = Pattern.compile("<tag2>");
while( scan.hasNextLine() ) {
String line = scan.readLine();
String modifiedLine = tag1Pattern.matcher(line).replaceAll("{");
modifiedLine = tag2Pattern.matcher(line).replaceAll("}");
...
}
你仍然每行应用两次模式匹配器,所以如果有任何性能命中,那就是原因。
在不知道您的数据是什么样的情况下,很难为您提供更准确的答案或更好的正则表达式。除非你在我写这篇文章的时候(再次)编辑了你的问题。