2012-03-17 7 views
5

私はEADGBEまたはDADF#ADの形式で文字列を分割し、それぞれが1文字または1文字と#記号を含む別々の文字列に分割したいとします。 brute-forceなアプローチで文字列を繰り返し処理するよりもエレガントな方法はありますか?Javaで区切られていない文字列を分割する良い方法はありますか?

String.splitは明らかに区切り文字に依存していますが、これは捨てられていますが、私にとってはそれほど役に立ちません。数分の間、split("[a-gA-G]#?");はうまくいくと思っていましたが、すべて - 私はほとんどその反対が欲しい...

+0

分割したい文字列の例を挙げられますか? – chandsie

+0

私は恐ろしい力の方法に行く必要があります恐れている – mac

+0

これは簡単です。ブルートフォースに行ってください。正規表現の複雑さや概要を追加しないでください。 –

答えて

3

ブルートフォースは、コードとパフォーマンスの両方の点で、最も良い選択肢になりそうです。

あなたが使用できるパターンの変化をforsee場合は別の方法として、あなたはMatcher

Pattern p = Pattern.compile("[a-gA-G]#?"); 
Matcher m = p.march(inputString); 
List<String> matches = new ArrayList<String>(); 
while(m.find()) 
    matches.add(m.group()); 
+0

ああ、非常にいいです - 私のグーグルではMatchersについて何も言わなかった!ありがとうございました。 :) – Oolong

1

を使用することができます。先読みと後読みを使う

String s = "DADF#AD"; 
    Pattern p = Pattern.compile("([a-gA-G]#?)"); 
    Matcher matcher = p.matcher(s); 
    while (matcher.find()) { 
     System.out.println(matcher.group()); 
    } 
1

は動作します:String regex = "(?<=.)(?=\\w#?)";

例えば、

import java.util.Arrays; 

public class Foo { 
    public static void main(String[] args) { 
     String[] tests = {"EADGBE", "DADF#AD"}; 
     String regex = "(?<=.)(?=\\w#?)"; 
     for (String test : tests) { 
     System.out.println(Arrays.toString(test.split(regex))); 
     } 
    } 
} 

戻り値:

[E、A、D、G、B、E]
[D、A、D、Fの#、A、D]は約

+0

'String regex ="(?=(?!^)\\ w#?) ";'、そこに行きます。 –

+0

@refp:これもうまくいくように見えます。スリックとありがとう! –

+0

ああ...私はそれがオプションだったか分からなかった!多分人に優しい技術ではないかもしれません。あるいは、初心者にはやさしいことを意味しているかもしれませんが、これはJavaで正規表現を使ってできることであることを認識することは間違いありません。ありがとうございました! – Oolong

0

方法:スプリット次に、区切り文字を追加します。

この方法は、それを使用するには、区切り文字

private static String delimit(String in) { 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < in.length()-1; i++) { 
    sb.append(in.charAt(i)); 
    if (in.charAt(i+1) != '#') 
     sb.append(';'); 
    } 
    return sb.toString(); 
} 

を追加します。

String[] notes = delimit("DADF#AD").split(";"); 
+0

不要な中間文字列を構築するのではなく、forループを使用してトークンのリストを生成するのはなぜですか? – Dunes

+0

@Dunes私は既に何十種類もの標準ソリューションを投稿しています - 何か違うことをしたいのですが) –

+0

heh!私はそれがうまくいくと思う、はい。デリミタを挿入するのは不思議でしたが、もっと簡単な方法が必要だとわかりました...他のユーザーが指摘しているように、そこにはあります!いずれにしても、おかげさまで、代替案を知っているのは健康的です... – Oolong

関連する問題