私が言ったように、一般的な信念 (人々が言うことすべてを信じないでください) に反して、ネストされたブラケットのマッチングは正規表現で可能です。
それを使用することの欠点は、ネストの固定レベルまでしかできないことです。そして、サポートしたい追加のレベルごとに、正規表現はどんどん大きくなります。
しかし、私の言葉を鵜呑みにしないでください。披露させて。正規表現:
\([^()]*\)
1 つのレベルに一致します。最大 2 レベルの場合、次のものが必要です。
\(([^()]*|\([^()]*\))*\)
等々。レベルを追加し続けるには、中間 (2 番目)[^()]*
の部分を([^()]*|\([^()]*\))*
(ここで 3 つのレベルを確認してください ) に変更するだけです。おっしゃるとおり、どんどん大きくなっていきます。
あなたの問題:
あなたの場合、2 つのレベルで十分かもしれません。そのため、Java コードは次のようになります。
String fortranCode = "code code u(i, j, k) code code code code u(i, j, k(1)) code code code u(i, j, k(m(2))) should match this last 'u', but it doesnt.";
String regex = "(\\w+)(\\(([^()]*|\\([^()]*\\))*\\))"; // (\w+)(\(([^()]*|\([^()]*\))*\))
System.out.println(fortranCode.replaceAll(regex, "__$1%array$2"));
入力:
code code u(i, j, k) code code code code u(i, j, k(1)) code code code u(i, j, k(m(2))) should match this last 'u', but it doesnt.
出力:
code code __u%array(i, j, k) code code code code __u%array(i, j, k(1)) code code code u(i, j, __k%array(m(2))) should match this last 'u', but it doesnt.
結論:
一般的に、パーサーはより良い仕事をします - それが人々がそれについてとても腹を立てる理由です。しかし、単純なアプリケーションの場合は、正規表現で十分です。
注:一部の種類の正規表現は、ネスト演算子をサポートしていますR
(Java はサポートしていませんが、PHP や Perl などの PCRE エンジンはサポートしています)。これにより、任意の数のレベルをネストできます。それらを使用すると、次のことができます\(([^()]|(?R))*\)
。