2017-05-19 11 views
0

フォーマット `%s_%d.y 'の文字列が必要です。たとえば、「aabsa_124.y」または「x_5.y」です。この文字列を解析するクリーナーの方法は?

文字列の数値部分を以下のコードで抽出していますが、数字を抽出するためのよりクリーンな方法がありますか?

String suffix = input.split("_")[1]; 
String numeric = suffix.split("\\.")[0]; 
int number = Integer.parseInt(numeric) 
+0

入力はどのように表示されますか? –

+0

あなたがどれくらい厳格になりたいかによって決まります。入力がその形式になっているとすれば、入力がうまくいくかどうかを保証できる場合とは異なるアプローチになるでしょう。個人的には、 'indexOf'メソッドと' substring'を使用します。 – Obicere

+0

私は同意します、インデックスは部分文字列で最高かもしれません – ab11

答えて

0

多分このような何か:あなたの文字列が多くのint型が含まれている場合

int number = Integer.parseInt(input.replaceAll("[^\\d]", "")); 

:あなたは、あなたがあなたのint型を解析することができ、空にすべての非degitを置き換えることができます

 String s = "aabsa_124.y"; 
     int number = Integer.parseInt(s.replaceAll("[^\\d]", "")); 
0

をこのintを抽出したい場合は、Patternsを使用できます。例:

String input = "aabsa_124_155.y"; 
Pattern p = Pattern.compile("\\d+"); 
Matcher m = p.matcher(input); 

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

出力

124 
155 
0

重要なことは、良い名前とユニットテストを持つ独自の方法で抽象構文解析ロジックにあります。それはあなたのコードをきれいにするでしょう。

個人的に私はこれに正規表現を使用します。

説明した入力は問題ありませんが、 "str_str_2.y"や "str_2.34.y"などの例では機能しません。どれでも馬鹿は、コンピュータが理解できるコードを書くことができ

:いくつかのトリッキーな1つのライナーを使用する前に

はこれを覚えています。良い プログラマは人間が理解できるコードを書く。

Martin Fowler氏、2008年

+0

私が提案したものよりも洗練された(より表情豊かな)構文解析方法があるかどうかについて意見を求めていました。 inputstring(input.indexOf( "_")、input.indexOf( "。")) – ab11

+0

非常に標準的なJavaコードが3行あります。これらの行が別々の方法で抽象化され、どこに貼り付けられてもコピーされないと、非常に表現力があります:) – vbuhlev

1

あなたはまた、より良いあなたが探している番号をキャプチャするために正規表現を使用することができます。ここでのregExpは、正の先読み(?=)と見た目後方(?< =)の両方を使用します。ルックアヘッド/ルックバックロジックを必要としない場合は、シンプルグループを使用することもできます。

String input = "aabsa_124.y"; 
Pattern p = Pattern.compile("(?<=\\_)\\d+(?=\\.\\w+)"); 
Matcher m = p.matcher(input); 
if (m.find()) { 
    int number = Integer.parseInt(m.group()); 
    System.out.println(number);//124 
} 

これも "str_str_2.y"のような文字列と一致します。

関連する問題