0

此代码工作正常:

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
     ..;
}

我期望更快的结果,因为正则表达式编译是一次且只有一次。

编辑

我想(如果可能的话)将replaceAll(..).replaceAll(..)模型放在 Pattern 中,并有tag1==>{tag2==> }

问题:外循环 Pattern模型比内循环 replaceAll.replaceAll模型快吗?

4

2 回答 2

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");

请参阅: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 语法结构的描述

于 2012-07-05T14:59:50.653 回答
1

replaceAll使用正则表达式模式。从 java.lang.String源代码

public String replaceAll(String regex, String replacement) {
    return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}

Edit1:请停止更改您的要求。选择一个问题并坚持下去。

编辑2:

如果您真的确定要这样做,在循环之外编译正则表达式,在最简单的情况下,您需要两种不同的模式:

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

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

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

于 2012-07-05T14:59:38.223 回答