3

Javaの正規表現ライブラリを使用しています。次の形式に対して文字列を検証したい:

31,5,46,7,86(...)

枚数は不明です。その文字列に少なくとも 1 つの数字が含まれていること、および 2 つの数字がコンマで区切られていることを確認したいと考えています。また、文字列から数値を取得したいと考えています。

(注:これは単純化された例にすぎません。string.split は実際の問題を解決しません)

次の正規表現を書きました。

({[0-9]++)((?:,[0-9]++)*+)

検証部分が機能します。ただし、数値を抽出しようとすると、2 つのグループが得られます。

Group1: 31
Group2: ,5,46,7,86

regex101 バージョン: https://regex101.com/r/xJ5oQ6/3

各番号を個別に取得する方法はありますか? つまり、コレクションで終了します。

[31, 5, 46, 7, 86]

前もって感謝します。

4

2 に答える 2

5

Java では、繰り返されるキャプチャ グループの個々の一致にアクセスすることはできません。詳細については、次の質問を参照してください:正規表現 - すべての繰り返しグループをキャプチャする

Tim Pietzcker が提供するコードも役に立ちます。少し作り直して、最初の数字に特別なケースを追加すると、次のようなものを使用できます。

String target = "31,5,46,7,86";

Pattern compileFirst = Pattern.compile("(?<number>[0-9]+)(,([0-9])+)*");
Pattern compileFollowing = Pattern.compile(",(?<number>[0-9]+)");

Matcher matcherFirst = compileFirst.matcher(target);
Matcher matcherFollowing = compileFollowing.matcher(target);

System.out.println("matches: " + matcherFirst.matches());
System.out.println("first: " + matcherFirst.group("number"));

int start = 0;
while (matcherFollowing.find(start)) {
    String group = matcherFollowing.group("number");

    System.out.println("following: " + start + " - " + group);
    start = matcherFollowing.end();
}

これは以下を出力します:

matches: true
first: 31
following: 0 - 5
following: 4 - 46
following: 7 - 7
following: 9 - 86
于 2016-06-10T14:43:54.723 に答える
0

これはあなたのために働くかもしれません:

/(?=[0-9,]+$)((?<=,|^)[0-9]{1,2})(?=,|$)/g

上記は、1 つまたは 2 つの数字に続いて、,または入力の終わりをキャプチャします。

global 修飾子を使用したことに注意してください。

オンラインで試す

于 2016-06-10T14:22:46.773 に答える