2016-06-12 20 views
2

私は現在何かのために書いたコードを解釈しようとしています。 、「}」の間で、文字列の上に分割され、私が達成しようとしています何Javaの2文字の間に文字列を分割する

{hey=yes}TEST

と「T」(任意の文字可能性がありT):私は分割したい情報は、次のようになります。私は後の午前の結果は(擬似コードで)です:

["{hey=yes}", "TEST"]

はどのようにしてそうやって行きますか?私は基本的な正規表現を知っていますが、これまで文字の間に文字列を分割するために使用することはありませんでした。

更新:

私はのstring.Splitメソッドを使用していた文字列を分割するために。これを行うより良い方法があるかどうかを教えてください。

+0

このロジックでは、文字列を吐くことが必要です...可能であればそれを提供してください.... –

+0

私が使用している方法の種類がロジックであれば、問題の説明が更新されました。 –

答えて

2

あなたは次のように、文字列のsplitメソッドを使用することができます。

String str = "{hey=foo}TEST"; 
String[] split = str.split("(?<=})");  
System.out.println(split[0] + ", " + split[1]); 

それは、この文字列とプリント分割:

{ちょっと= FOO}、TEST

  • ?<=}は、文字の後に分割することです}の文字を維持しながらを保持します。デフォルトでは、文字を分割しただけの場合、分割によって削除されます。入力が予想される次のことをあなたはまた、正規表現のアプローチを探しているなら how-to-split-string-with-some-separator-but-without-removing-that-separator-in-j

-2

は、いくつかの検証をしたい:splitメソッドを使用している場合

  • この他の答えは、すべてのオプションの完全な説明を提供します構文あなたは、おそらくこのような何かしたい:

    public List<String> splitWithRegexp(String string) 
    { 
        Matcher matcher = Pattern.compile("(\\{.*\\})(.*)").matcher(string); 
        if (matcher.find()) 
         return Arrays.asList(matcher.group(1), matcher.group(2)); 
        else 
         throw new IllegalArgumentException("Input didn't match!"); 
    } 
    

    を正規表現で括弧を使用すると、にアクセスできるグループを、キャプチャが呼び出されます。グループ0はパターン全体と一致します。

  • +0

    あなたがパフォーマンスについて心配しているならば、 'Pattern.compile("(\\ {。* \\})(。*) ")'を 'static final'フィールドとして宣言し、あなたのメソッドでそのフィールドを使います。 –

    1

    このような小さなコードにregexpを使用すると、何千回も繰り返される場合(たとえば、大量のドキュメントのAlfrescoメタデータを分析する場合など)、実際には遅くなる可能性があります。このスニペットで

    ルック:

    String s = "{key=value}SOMETEXT"; 
        String[] e = null; 
        long now = 0L; 
    
        now = new Date().getTime(); 
        for (int i = 0; i < 3000000; i++) { 
         e = s.split("(?<=})"); 
        } 
        System.out.println("Regexp: " + (new Date().getTime() - now)); 
    
        now = new Date().getTime(); 
        for (int i = 0; i < 3000000; i++) { 
         int idx = s.indexOf('}') + 1; 
         e = new String[] { s.substring(0, idx), s.substring(idx) }; 
        } 
        System.out.println("IndexOf:" + (new Date().getTime() - now)); 
    

    結果が

    Regexp: 2544 
    IndexOf:113 
    

    ですこれは正規表現は(簡単に)、サブストリングよりも25倍遅いことを意味しています。それは、効率的なコードとエレガントな(!)コードの違いを作ることができることに留意してください。

    +1

    ユースケースが数百万のレコードを処理している場合、コードを最適化することがポイントになります。そうでなければ、信頼できる読みやすいコードに焦点を当てます。 Michael A Jacksonsの言葉を覚えておいてください。「最適化のルール: ルール1:しないでください。 ルール2(専門家のみ):まだやってはいけません。 –