0

スラッシュの間に数字を含む部分文字列 (例: /n/) を検索していますが、find() メソッドは常に正規表現の最初の出現を渡します。なんで?私の正規表現に何か問題がありますか?

Pattern p = Pattern.compile("(\\/)(\\d+)(\\/)"); 
Matcher m = p.matcher("A/8/E/5/F/6/G/7/H");
while (m.find()) {
    System.out.println(m.group(0));
}
4

4 に答える 4

1

数字だけを印刷したい場合は、 を使用しますm.group(2)

System.out.println(m.group(2));

別の解決策は、先読みと後読みを使用することです

Pattern p = Pattern.compile("(?<=\\/)(\\d+)(?=\\/)");
Matcher m = p.matcher("A/8/E/5/F/6/G/7/H");
while (m.find()) {
    System.out.println(m.group(0));
}
于 2013-04-26T07:12:05.163 に答える
0

m を使用すると仮定すると、グループは「/」、「8」、および「/」です。'8' だけに一致するには '\/(\d+)\/' を試してください

于 2013-04-26T07:15:37.960 に答える
0

括弧内の i 番目のものを抽出するために使用する必要がありgroup(i)ます (非キャプチャ グループを除く)。

group(0)またはgroup()全体のパターンです。

したがって、あなたの例では、が必要group(2)です。

また、コードは、前がないために一致できないため、間に使用されているために一致できない8/5/4/3ため、コードが機能しないことに注意してください。の文字列の開始 ( )と文字列の終了( )のチェックを含め、の先読みを使用する必要があります。8/45/3/^8$3(?=...)4

非キャプチャ グループ も使用したので、代わりに(?:...)使用できます(これが唯一の違いです)。group(1)group(2)(?:...)

また、エスケープする必要はありません/

最終的なコード:

Pattern p = Pattern.compile("(?:^|/)(\\d+)(?=/|$)");
Matcher m = p.matcher("8/5/4/3");
while (m.find()) {
    System.out.println(m.group(1));
}

正規表現リファレンス.

テスト

于 2013-04-26T07:22:27.770 に答える
0

numberそれらの間だけが必要なので、これを行う必要があると思いますslashes

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

group(0) - 全体の一致を与える(/n/)

group(1) - 最初のスラッシュを与える(/)

group(2) - 番号を提供します(n)

group(3) - 2 番目のスラッシュを表示します(/)

于 2013-04-26T07:11:09.557 に答える