元の質問に答えるには:はい、それを行うことができます。実際、ループ内で同じ正規表現を複数回適用すると、元のコードよりも高速になります。ループは次のように書き直す必要があります。
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 構文構造の説明