0

SPXXX-SPYYY.zipStringの形式を常に固定しています。

からXXXYYYを抽出する必要がありますStringが、たとえばXXXが 003の場合、 003ではなく3が必要です。( YYYも同様)。

私はこれらの2つのコードを書きました:

1.

String st = "SP003-SP012.zip";
String[] splitted = st.split("\\.");
splitted = splitted[0].split("-");  
splitted = splitted[0].split("P");
Integer in = new Integer(splitted[1]);
System.out.println(in); //Will print 3
//The same for the other part of the String

2.

Pattern pattern = Pattern.compile("^[a-zA-Z]+([0-9]+).*");
Matcher matcher = pattern.matcher(st);
int num = 0;
while (matcher.find()) {
   num = Integer.parseInt(matcher.group(1));
   System.out.println(num);
} 
  • 2 番目のコードが最初の数値のみを返すのはなぜですか? ( XXX ) 2 番目を逃しますか?
  • この目的にはどのコードが適していますか?
4

5 に答える 5

4

常に同じ形式である場合は、単に使用しないのはなぜsubstringですか?

String str = "SP003-SP456.zip";
int xxx = Integer.parseInt(str.substring(2, 5));
int yyy = Integer.parseInt(str.substring(8, 11));

または、これらのXXXYYYが必ずしも数字ではない場合は、次のように追加しtry-catchます。

String str = "SP003-SP456.zip";
int xxx, yyy;

try {
    int xxx = Integer.parseInt(str.substring(2, 5));
}
catch(NumberFormatException e) {
   xxx = 0;
}

try {
    int yyy = Integer.parseInt(str.substring(8, 11));
}
catch(NumberFormatException e) {
   yyy = 0;
}
于 2013-02-26T09:25:36.827 に答える
1

2 番目のコードが最初の数値のみを返すのはなぜですか? (XXX) 2 番目を逃しますか?

パターン - を見ると、先頭"^[a-zA-Z]+([0-9]+).*"にアンカーがあります。caret - ^つまり、パターンは文字列の先頭でのみ検索されます。SPXXXそのため、 string の先頭にあるが"SPXXX-SPYYY"、 pattern ではなく、対応する最初の番号のみが取得されます。これは、先頭にないため、SPYYY一致しないためです。

を削除できますが、メソッドを使用しているため、最後にそれはcaret (^)必要ありません。.*Matcher#find()

Pattern pattern = Pattern.compile("[a-zA-Z]+([0-9]+)");

ただし、文字列が常に同じ形式であることを考えると、より単純なパターンを使用することもできます。

Pattern pattern = Pattern.compile("\\d+");

マッチャーからグループ 1を取得します。

この目的にはどのコードが適していますか?

私は2番目のアプローチで行きます。文字列の分割は常に機能するとは限らず、文字列が大きくなるにつれて複雑になります。split実際に区切り文字で文字列を分割したい場合にのみ使用してください。この場合、文字列を分割するのではなく、特定のパターンを抽出する必要があります。そして、2番目のアプローチは行く方法です。

于 2013-02-26T09:28:08.680 に答える
1

このようにパターンを定義しますPattern.compile("[a-zA-Z]+([0-9]+)");

例の文字列のmatcher一致SPXXXSPYYY、ループの 2 回の繰り返しの場合。

Andは、2 つのケースに対してそれぞれとをgroup(1)返します。XXXYYY

于 2013-02-26T09:30:55.647 に答える
1

2 番目のコードが最初の数値のみを返すのはなぜですか? (XXX) 2 番目を逃しますか?

正規表現は、一連の数字が表示されることを期待していることのみを定義し、それらをキャプチャするキャプチャ グループは 1 つしかないためです。正規表現は、文字の後に数字が続くことを想定しており、それに一致するものを 1 つだけ見つけます。(最初のビットが消費されると、文字が残っていないため、一致するものはありません[a-zA-Z]+。) マッチャーを繰り返し実行しようとするのではなく、両方のビットに一致する単一の正規表現を定義することをお勧めします。

Pattern pattern = Pattern.compile("^[a-zA-Z]+([0-9]+)-([0-9]+).*");

...そして、結果の 2 つのキャプチャ グループを使用します。\d(また、数字を一致させるために使用できることに注意してください:

Pattern pattern = Pattern.compile("^[a-zA-Z]+(\\d+)-(\\d+).*");

...しかし、それは補足です。)

この目的のために正規表現を使用することは、私が提案した最初のコードよりも優れていますか?

それはあなた次第です、それは判断の呼びかけです。この特定のケースでは、フォーマットが本当に不変である場合、Aleks G のアプローチを使用します。

于 2013-02-26T09:25:58.157 に答える
1

以下を使用します。

Pattern pattern = Pattern.compile("^[a-zA-Z]+0*(\\d+)-[a-zA-Z]+0*(\\d+).*");
Matcher matcher = pattern.matcher(st);
if (matcher.matches()) {
   int num1 = Integer.parseInt(matcher.group(1));
   int num2 = Integer.parseInt(matcher.group(2));
   System.out.println(num1+" - "+num2);
} 
于 2013-02-26T09:26:53.213 に答える