2017-02-06 1 views
0

文字列内の正規表現をパースした$ 1で置き換えたいと思います。これどうやってするの?replaceAllでプログラム的にグループを取得する

String line = "foo <<VAR>> bar <<VAR>>"; 
    Matcher matcher = Pattern.compile("<<(\\w*?)>>").matcher(line); 
    Map<String,String> replacements = Collections.singletonMap("VAR","REPLACEMENT"); 
    String replacedLine = matcher.replaceAll(replacements.get(?.group(1))); 
    Assert.assertTrue("foo REPLACEMENT bar REPLACEMENT".equals(replacedLine)); 
+0

なぜ文字列のreplaceAllメソッドを使用していないのですか? – armnotstrong

答えて

1

"あなたが一致して" あなたは結果を構築するためにMatcher#appendReplacementメソッドを使用できます

String line = "foo <<VAR>> bar <<VAR>> in <<NO>>"; 
Matcher m = Pattern.compile("<<(\\w+)>>").matcher(line); 
Map<String,String> replacements = Collections.singletonMap("VAR","REPLACEMENT"); 
StringBuffer replacedLine = new StringBuffer(); 
while (m.find()) { 
    if (replacements.get(m.group(1)) != null) 
     m.appendReplacement(replacedLine, replacements.get(m.group(1))); 
    else 
     m.appendReplacement(replacedLine, m.group()); 
} 
m.appendTail(replacedLine); 
System.out.println(replacedLine.toString()); // => foo REPLACEMENT bar REPLACEMENT in <<NO>> 

Java demoを参照してください。

1

これはあなたのニーズを満たしていますか?

String line = "foo <<VAR>> bar <<VAR>>"; 

Map<String, String> replaceMap = new HashMap<>(); 
replaceMap.put("<<VAR>>", "REPLACEMENT"); 
//may be more replacement here 

for(Map.Entry<String, String> entry: replaceMap.entrySet()){ 
    line = line.replaceAll(entry.getKey(), entry.getValue()); 
} 

System.out.println(line); //<- foo REPLACEMENT bar REPLACEMENT 
+0

これは素晴らしいですが、大きなファイルの中で各マップの値を繰り返し処理しなければならないので、私はそれを破棄しました。 – Whimusical

+0

@Whimusical今、私はあなたにポイントを与えていますが、 .replaceAll() 'は、' line.replace() 'に置き換えることができます。これはもっと速くなければならないと思っていますが、効率的ではないので、すべての正規表現のマッチよりも効率的です。正規表現の一致はです。 – armnotstrong

関連する問題