2017-01-31 29 views
0

の部品を使用してJavaの正規表現のキャプチャグループを交換してどのような文字列で次の交換を行うためのJavaでの最良の方法である:私はこれに似たテキスト持って自分自身

one two [[**my_word** other words]] three four [[**my_other_word** other words]] five six 

をし、私が欲しいです次のテキスト

one two **my_word** three four **my_other_word** five six 

正規表現のキャプチャグループを使用しようとしましたが、1つのキャプチャグループを別のものに置き換えるにはどうすればよいですか?

+1

あなたが試したこととどこにいらっしゃったのかを示すことはできますか? – CKing

+0

各グループの番号は$ 1、$ 2、$ 3 ...そして、あなたはそれを使うことができます。 $ 1 =グループ1をキャプチャした、例$ 1 = potato => "hi $ 1"(ハイポテト)。 –

+0

Java Pattern and Matcher APIを使ってみると、私は立ち往生しました。 – xgb84j

答えて

1
a.replaceAll("\\[\\[(\\*\\*\\w+\\*\\*)(?:\\s\\w+\\s?)+\\]\\]", "$1"); 
+0

使用している単一のバックスラッシュは、javaの正規表現エスケープ文字としては無効です。彼らは二重のバックスラッシュである必要があります。 – Falle1234

+0

ちょっと、ちょうどあなたの最後のC++の質問にあなたにpingしたかったのです。あなたは間違っていた。 'std :: vector ベース(values-> begin()+ 1、values-> begin()+ 4);'は最初の3つの要素しか与えません。最初の4つの要素を取得するには、4から5に変更する必要があります。 – NathanOliver

+0

@NathanOliverああ、私はそれが愚かな間違いであることを知っていた。包括的または排他的な終了範囲であるかどうかはわかりませんでした。ありがとう! –

1

ような何かを、あなたは

a.replaceAll("\\[\\[(\\*\\*\\w+\\*\\*).*?\\]\\]", "$1"); 

ようonelinerを使用することができますいずれか、またはより多くのcあなたがそれぞれのマッチを置き換えるものを制御することができる完全なバージョン。

String inputString = "one two [[**my_word** other words]] three four [[**my_other_word** other words]] five six"; 
Pattern pattern = Pattern.compile("\\[\\[(\\*\\*\\w+\\*\\*).*?\\]\\]", Pattern.DOTALL); 
Matcher matcher = pattern.matcher(inputString); 
StringBuffer outputBuffer = new StringBuffer(); 
while (matcher.find()) { 
    String match = matcher.group(1);   
    matcher.appendReplacement(outputBuffer, match); 
} 
matcher.appendTail(outputBuffer); 

String output = outputBuffer.toString(); 
関連する問題