2017-11-14 11 views
1

テキストの各単語の後に、指定された部分文字列で終わる 指定された単語を挿入する必要があります。私のコードはある程度機能します。 StringBuilderオブジェクトを反復処理します。ご覧のように、最後の2つのケースでは、「kalola」と「lalilo」で失敗します。どうもありがとう!与えられた部分文字列で終わる各単語の後に単語を挿入する

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class TextEditor { 

    public static void main(String[] args) { 

     String text = "Hello Mister James! Do you use trello fregiently? " 
       + "Do you know Canelo Pavelo magenta ravelo sagenta! " 
       + "lolita kalola lalilo lalita 333l lo."; 

     String regex = "\\b\\w+lo\\b"; 

     String word = " 232 "; 

     StringBuilder copyOfText = new StringBuilder(text); 

     Pattern pattern = Pattern.compile(regex); 

     Matcher matcher = pattern.matcher(copyOfText); 

     while(matcher.find()) { 
      copyOfText.insert(matcher.end(), word); 
     } 

     //text = copyOfText.toString(); 

     System.out.println(copyOfText); 
    } 
} 

受信出力は、次のとおりです。

こんにちは232のミスタージェームズ!あなたはtrello 232をfregiently使っていますか?あなたは を知っていますかCanelo 232 Pavelo 232 magenta ravelo 232 sagenta! lolita kalo 232 la lalilo lalita 333l lo。

期待出力は次のようになります。

こんにちは232ミスタージェームズ!あなたはtrello 232をfregiently使っていますか?あなたは を知っていますかCanelo 232 Pavelo 232 magenta ravelo 232 sagenta!ロリータ kalola lalilo 232 lalita 333l lo。あなたはwhileループで繰り返し処理するのではなく、String.replaceAllを使用することができますコメントで述べたように

+1

whileループではなくreplaceAllを使用するのはなぜですか? – CAustin

+1

[あなたの正規表現は正常です](https://regex101.com/r/Fro6Uo/1)、あなたのロジックはそうではありません。 @CAustinが述べたように、replaceAllを使用してください。 – ctwheels

答えて

1

String text = "Hello Mister James! Do you use trello fregiently? " 
     + "Do you know Canelo Pavelo magenta ravelo sagenta! " 
     + "lolita kalola lalilo lalita 333l lo."; 

String word = "232"; 

System.out.println(text.replaceAll("(\\w+lo\\b)", "$1 " + word)); 

出力:

こんにちは232ミスタージェームズ!あなたはtrello 232をfregiently使っていますか?ご存知ですか Canelo 232 Pavelo 232 magenta ravelo 232 sagenta! lolita kalola lalilo 232 lalita 333l lo。

+0

ありがとう!ドル記号と数字はここで "$ 1"とは何ですか? – AmacOS

+0

カッコ内の正規表現は、[キャプチャグループ](https://www.regular-expressions.info/brackets.html)です。 '$ 1 'は、取り込まれたグループを置換文字列に含めることです。あなたがそれを含んでいなければ、一致したすべての単語( "Hello"、 "trello" ...)は完全に "232"に置き換えられます。 –

+2

この状況では、キャプチャグループは必要ありません。あなたは完全一致を参照するだけです。 'text.replaceAll(" \\ w + lo \\ b "、" $ 0 "+ word)'を実行するだけで、いくつかの文字が保存されます。 –

関連する問題