更改符号Pattern / Matcher中的标签

时间:2012-07-05 14:38:41

标签: java regex

此代码可以正常工作:

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模型更快?

2 个答案:

答案 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("}");
    ...
}

你仍然每行应用两次模式匹配器,所以如果有任何性能命中,那就是原因。

在不知道您的数据是什么样的情况下,很难为您提供更准确的答案或更好的正则表达式。除非你在我写这篇文章的时候(再次)编辑了你的问题。