最初と 3 番目のグループに括弧の前後のすべての文字を含める場合は、 andを除外する必要があり(
ます)
( 2 番目の例.*
のように、括弧を含むグループにも一致(foo)(bar)
します)。
だから私はこれに置き換え.*
ます[^\\(\\)]*
。
また、2 番目のグループの多くの部分文字列を含む文字列と一致させたい場合 (2 番目の例のように)、*
2 番目のグループの後にある必要があります。
私の結果はこれでした:
^([^\\(\\)]*)?(\\([a-z]*\\))*([^\\(\\)]*)?$
これは最初の例と 2 番目の例で機能しますが、2 番目のグループは最終的に最後に見つかったもののみを保存します - (bz)
.
2 番目の例で述べたように、2 番目のグループを 3 回キャプチャできるようにしたい場合は、while m.find()
代わりにif m.matches()
( m
is a Matcher
object);を使用してみてください。また、正規表現をこれに少し変更します。
([^\\(\\)]*)(\\([a-z]*\\))([^\\(\\)]*)
これは、文字列内のすべての可能な一致の 2 番目のグループになります - (foo)
, (bar)
, (bz)
.
編集:私が本当に説明できない何らかの理由で、私にとっては(foo)
、他の2つだけが見つかりません。find()
そこで、最後に見つかったグループが終了した位置から明示的に開始して、パラメーターを適用しようとするコードを書きました。
String regex = "([^\\(\\)]*)(\\([a-z]*\\))([^\\(\\)]*)";
String text = "(foo)(bar)(bz)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(text);
for (int reg = 0; reg < text.length(); reg+=(m.end()-m.start()))
if (m.find(reg))
for (int group = 1; group <=m.groupCount(); group++)
System.out.println("Group "+group+": "+m.group(group));
これは機能し、出力は次のとおりです。
Group 1:
Group 2: (foo)
Group 3:
Group 1:
Group 2: (bar)
Group 3:
Group 1:
Group 2: (bz)
Group 3: