2016-03-29 6 views
1

私は数字の文字列を持っています。私はそれらの数字を長さ3のブロックでグループ化し、1つのダッシュで区切る必要があります。必要に応じて、最後のブロックまたは最後の2つのブロックの長さを2にすることができます。文字列を3つのブロックに分割しますか?

String abc = "12-10 23 5555 8361"; 
    String hello = abc.replaceAll("[^a-zA-Z0-9]", ""); 
    // now how can I group them in blocks of length three? 
+0

あなたは私たちに、文字列になるべきかの例を与えることができますか? – Druzion

+0

期待される出力は? '12-10'はどうですか? –

+0

上記サンプルの期待値は121-023-555-583-61ですか? –

答えて

1

あなたは後読みベースの正規表現の中に\Gを使用することができます。

String abc = "12-10 23 5555 8361"; 
String hello = abc.replaceAll("[^a-zA-Z0-9]", ""); 
System.out.println(hello.replaceAll("(?<=\\G\\d{3})", "-")); 
// => 121-023-555-583-61 

IDEONE demo

(?<=\\G\\d{3})正規表現は、開始時の位置に一致するだけでゼロ幅アサーションが含まれています参照してください。文字列または最後に成功したマッチ(\G)の最後に3桁の数字(\d{3})が続きます。 Javaの正規表現では、このパターンは現在のシナリオで正常に機能します(つまり、\Gは見た目の内側から正規表現インデックスを移動します)。しかし、これはAndroidではうまくいきません。

UPDATE

更新要件について、あなたは正規表現が失敗終わりに(?!$)で更新されanother IDEONE demo

を参照してください

public static void main (String[] args) throws java.lang.Exception 
{ 
    String s = "0 - 22 1985--324"; // => 022-198-53-24 
    run(s); 
    s = "555372654"; // => 555-372-654 
    run(s); 
    s = "12-10 23 5555 8361"; // => 121-023-555-583-61 
    run(s); 
} 
public static void run(String abc) { 
    String hello = abc.replaceAll("[^a-zA-Z0-9]", ""); 
    hello = hello.replaceAll("(?<=\\G\\d{3})(?!$)", "-"); 
    System.out.println(hello.replaceAll("\\b(\\d{2})(\\d+)-(\\d)$", "$1-$2$3")); 
} 

のようないくつかのステップのアプローチを使用することができます文字列の最後に一致します。

.replaceAll("\\b(\\d{2})(\\d+)-(\\d)$", "$1-$2$3")最後に2桁のグループを並べ替える必要があります.3桁以上の数字の後にハイフンを1桁だけ入力する場合は、最初の2桁の後にハイフンを移動し、このハイフンの直後に他の数字を移動します。

+0

@ user1950349:質問を関連する詳細で更新できますか?また、いくつかのサンプル文字列に対して正確な期待出力を提供します。 –

1

また、3桁の数字をグループ化し、捕捉されたグループと-と置き換えることもできます。

正規表現:(\d{3})

交換を行うには:

String abc = "12-10 23 5555 8361"; 
String hello = abc.replaceAll("[^a-zA-Z0-9]", ""); 
System.out.println(hello.replaceAll("(\\d{3})", "$1-")); 

Regex101 Demo

Javaコードと交換してください

Ideone Demo

+1

この番号は、「555372654」の末尾に '-'が付きます。 – user1950349

+0

@ user1950349:確認してください。 –

+0

そして各ブロックは少なくとも2桁でなければなりません。この例では '0 - 22 1985--324'は' 022-198-532-4'を得て失敗します。代わりに私は '022-198-53-24'を打つべきです – user1950349

関連する問題