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

正規表現のコンパイルは1回だけなので、より速い結果が期待できます。

編集

(可能であれば)replaceAll(..).replaceAll(..)モデルをパターンに入れ、 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:

ループの外で正規表現をコンパイルして、この方法でやりたいことが本当にある場合は、最も単純なケースでは、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("}");
    ...
}

パターン マッチャーを 1 行につき 2 回適用しているため、パフォーマンス ヒットがある場合はそれが原因です。

データがどのように見えるかを知らなければ、より正確な答えやより良い正規表現を提供することは困難です。私がこれを書いている間にあなたがあなたの質問を(再び)編集していない限り。

于 2012-07-05T14:59:38.223 に答える