2012-11-14 17 views
7

私はGoogleの検索結果のページやページを見てきましたが、私を助けてくれるものは見つかっていません。数字/文字の組み合わせのJava(Regex?)分割文字列

私がしようとしているのは、Bananas22Apples496Pears3のような文字列を分割し、それをいくつかの種類の読みやすい形式に分割することです。 String.split()はこれを行うことができないので、これを達成できる正規表現のスニペットを誰かが指摘できるかどうか疑問に思っていました。上記の文字列は、(簡単のためにString[])に分割されます:

{"Bananas:22", "Apples:496", "Pears:3"} 

答えて

4

最初のステップは、と空の文字列を置き換えることであろうこの

String s = "Bananas22Apples496Pears3"; 

String[] res = s.replaceAll("(?<=\\p{L})(?=\\d)", ":").split("(?<=\\d)(?=\\p{L})"); 
    for (String t : res) { 
     System.out.println(t); 
    } 

試してみてください。左側にlookbehind assertion(?<=\\p{L})と、右側の文字がで、数字でいるときに、「」 lookahead assertion(?=\\d)

次に、左側が数字、右側が文字の場合は結果を分割します。

\\p{L}は、すべての言語のすべての文字と一致するUnicode propertyです。

3

あなたはstring.Youだけで

分割でそれを行うことはできません splitその後、 Replaceに必要なビットを拡大

1>Replace All次の正規表現

(\\w+?)(\\d+) 
を持つ文字列

と今

$1:$2 

2>と交換Splitそれがこの正規表現と

(?<=\\d)(?=[a-zA-Z]) 
+0

私は正規表現と全く熱くないんだけど、私はそのパターンを使用してpattern.compileを試してみましたが、私は、「無効なエスケープシーケンス」というエラーが表示されます。 – Timr

+0

@Timr Javaパターンの例を読んだければ、これは確かに助けになるでしょう。\\ w +?\\ d + "' – Anirudha

+0

@Timrこのようにあなたはエスケープしませんでした。私は彼らがあなたにもエスケープを教えてくれると確信しています。 –

0

:$0\d+を交換し、その後(?=[a-zA-Z]+:\d+)で分割しました。

+0

'$ 1'は' $ 0'でなければなりません – Anirudha

1

これは、あなたが欲しいものを行う必要があります。

import java.util.regex.*; 

String d = "Bananas22Apples496Pears3" 

Pattern p = Pattern.compile("[A-Za-z]+|[0-9]+"); 

Matcher m = p.matcher(d); 

while (m.find()) { 
     System.out.println(m.group()); 
} 

// Bananas 
// 22 
// Apples 
// 496 
// Pears 
// 3 
0
String myText = "Bananas22Apples496Pears3"; 
System.out.println(myText.replaceAll("([A-Za-z]+)([0-9]+)", "$1:$2,")); 
関連する問題