スラッシュの間に数字を含む部分文字列 (例: /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));
}
数字だけを印刷したい場合は、 を使用します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));
}
m を使用すると仮定すると、グループは「/」、「8」、および「/」です。'8' だけに一致するには '\/(\d+)\/' を試してください
括弧内の i 番目のものを抽出するために使用する必要がありgroup(i)
ます (非キャプチャ グループを除く)。
group(0)
またはgroup()
全体のパターンです。
したがって、あなたの例では、が必要group(2)
です。
また、コードは、前がないために一致できないため、間に使用されているために一致できない8/5/4/3
ため、コードが機能しないことに注意してください。の文字列の開始 ( )と文字列の終了( )のチェックを含め、の先読みを使用する必要があります。8
/
4
5
/
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));
}
テスト。
number
それらの間だけが必要なので、これを行う必要があると思いますslashes
。
while (m.find()) {
System.out.println(m.group(2));
}
group(0) - 全体の一致を与える(/n/)
group(1) - 最初のスラッシュを与える(/)
group(2) - 番号を提供します(n)
group(3) - 2 番目のスラッシュを表示します(/)