2016-10-13 7 views
1
String data ="A486A946D48967E456F679B3425B234C847C 
      A725A872D74985E45346F679B86705B234C2847C 
Output should be in format like below: 
-486 
-3425 
-847 

-725 
-86705 
-2847 

上記は値を抽出したいデータです。それらは同じフォーマットです。A...A...D...E...F...B...B...C...Cドットは数字を表します。Javaの同じ2文字間で値を抽出する

上記のようにA-A, B-BC-Cの間の数字を抽出したいと思います。これらのデータはすべて1行に文字列として格納されます。パターンマッチャーを使用しましたが、動作しませんでした。どんな提案もお願いします。

+2

正規表現を使用する –

+0

2つのchar変数prevとcurrをとり、それらが同じかどうかをチェックします。文字が一致する場合は両方の変数を更新しません。 – Gaur93

+0

クエリーは無料です –

答えて

1

次のコードを使用できます。

char c1 = '\0'; 
char c2 = '\0'; 
String str = ""; 
for(int i = 0;i < data.length();++i) 
{ 
if(data.charAt(i) >= 65&&data.charAt(i) <= 90) 
{ 
    if(c1 == '\0') 
    c1 = data.charAt(i); 
    else if(c2 == '\0') 
    c2 = data.charAt(i); 
    if(c1 != '\0' && c2 != '\0') 
    { 
    if(c1 == c2 && str.length() != 0) 
    System.out.println("-"+str); 
    str = ""; 
    c1 = c2; 
    c2 = '\0'; 
    } 
} 
else 
    str += data.charAt(i); 
} 
+0

通常は、Stringの代わりにStringBuilderを使用して、ループで連結して文字列を構築することをお勧めします。 (つまり、String strはStringBuidlerでなければなりません)。 –

6
Pattern pattern = Pattern.compile("([A-Z])(\\d+)\\1"); 
Matcher m = pattern.matcher(data); 
while (m.find()) { 
    String letter = m.group(1); 
    String digits = m.group(2); 
    int n = Integer.parseInt(digits); 
    System.out.printf("- %s = %d%n", letter, n); 
} 

パターンから成る:

  • ([A-Z]) = 1桁以上の数字
  • \1と大文字
  • (\d+) =群2と群1 =グループ1の値
+0

このサイトでは、あなたのコードよりも遅いので、些細な問題に対してはパターンとマッチャーを使用しないことをお勧めしました。 –

+1

@SumeetSingh確かに私はあなたの答えをupvoted、StringBuilderが使用されている必要があります。正規表現はうまくいきます。バックトラックの必要がないからです(偽の半一致、ループのループを取り消す)。ソリューションは簡単で、エラーが発生しにくく、理解しやすく、保守が容易です。品質も重要です。 –

+0

私はStringを使用しました。 –

関連する問題