Java - 正規表現で文字列を抽出する 質問する

Java - 正規表現で文字列を抽出する 質問する

私はこの文字列を持っています

String myString ="A~BC~FGH~~zuzy|XX~ 1234~ ~~ABC~01/01/2010 06:30~BCD~01/01/2011 07:45";

そして、これら3つの部分文字列を抽出する必要があります
1234
06:30
07:45

この正規表現\\d{2}\:\\d{2}を使用すると、最初の1時間06:30のみを抽出できます。

Pattern depArrHours = Pattern.compile("\\d{2}\\:\\d{2}");
Matcher matcher = depArrHours.matcher(myString);
String firstHour = matcher.group(0);
String secondHour = matcher.group(1); (IndexOutOfBoundException no Group 1)

matcher.group(1) は例外をスローします。
また、1234 を抽出する方法がわかりません。この文字列は変更される可能性がありますが、常に 'XX~ ' の後に続きます。
これらの文字列を正規表現で一致させる方法について何かアイデアはありますか?

アップデート

Adamの提案のおかげで、文字列に一致する正規表現ができました

Pattern p = Pattern.compile(".*XX~ (\\d{3,4}).*(\\d{1,2}:\\d{2}).*(\\d{1,2}:\\d{2})";

数字と2時間をmatcher.group(1); matcher.group(2); matcher.group(3);で一致させます。

ベストアンサー1

このmatcher.group()関数は、1 から始まるキャプチャ グループ インデックスという 1 つの整数引数を取ることを想定しています。インデックス 0 は特別なもので、「一致全体」を意味します。キャプチャ グループは、括弧 " (...)" のペアを使用して作成されます。括弧内のものはすべてキャプチャされます。グループは、開き括弧によって左から右に番号が付けられます (この場合も 1 から始まります) (つまり、グループは重複できます)。正規表現には括弧がないため、グループ 1 は存在しません。

Javadocはパターンクラスは正規表現の構文をカバーします。

何回か繰り返される可能性のあるパターンを探している場合は、Matcher.探す()false が返されるまで繰り返します。Matcher.group(0)各反復で 1 回、その時点で一致したものが返されます。

一度にすべてに一致する 1 つの大きな正規表現を作成したい場合 (これが必要なことだと思います)、キャプチャする 3 つのセットのそれぞれの周りにキャプチャ括弧のセットを配置し、 を使用します。Matcher.match()ここでMatcher.group(n)、n はそれぞれ 1、2、3 です。もちろん、Matcher.match()false が返される可能性もあります。その場合、パターンは一致せず、どのグループも取得できません。

あなたの例では、おそらく、先行するテキストに一致させてから、キャプチャ グループを開始し、数字に一致させて、キャプチャ グループを終了する、などを行うことになります。正確な入力形式についてはよくわかりませんが、ここに例があります。

次のような形式の文字列があるとします。

Eat 12 carrots at 12:30
Take 3 pills at 01:15

そして、数量と回数を抽出したいのです。正規表現は次のようになります。

"\w+ (\d+) [\w ]+ (\d{1,2}:\d{2})"

コードは次のようになります。

Pattern p = Pattern.compile("\\w+ (\\d+) [\\w ]+ (\\d{2}:\\d{2})");
Matcher m = p.matcher(oneline);
if(m.matches()) {
    System.out.println("The quantity is " + m.group(1));
    System.out.println("The time is " + m.group(2));
}

正規表現は、「単語、スペース、1 つ以上の数字 (グループ 1 でキャプチャされます)、スペース、スペースで終わる単語とスペースのセット、その後に続く時刻 (グループ 2 でキャプチャされ、時刻は常に 0 で埋められて 2 桁になると想定されます) を含む文字列」を意味します。探しているものにもっと近い例を挙げますが、可能な入力の説明は少し曖昧です。

おすすめ記事