15

次のような括弧内の文字列と一致させたい:

(i, j, k(1))
^^^^^^^^^^^^

文字列には閉じ括弧も含めることができます。これは私のプロジェクトの小さな部分であるため、パーサーを作成せずにJavaで正規表現と一致させる方法。ありがとう!

編集:

文字列ブロックを検索してu(i, j, k)u(i, j, k(1))または単にのようなものを見つけ、それらをFortran 翻訳アプリケーションにu(<anything within this paired parens>)置き換えたいと考えています。__u%array(i, j, k)__u%array(i, j, k(1))

4

3 に答える 3

26

私が言ったように、一般的な信念 (人々が言うことすべてを信じないでください) に反して、ネストされたブラケットのマッチング正規表現で可能です。

それを使用することの欠点は、ネストの固定レベルまでしかできないことです。そして、サポートしたい追加のレベルごとに、正規表現はどんどん大きくなります。

しかし、私の言葉を鵜呑みにしないでください。披露させて。正規表現:

\([^()]*\)

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))*\)

于 2013-07-20T06:08:22.200 に答える
1

仕事を分けてください。正規表現を次のようにします。

([a-z]+)\((.*)\)

最初のグループには識別子が含まれ、2 番目のグループにはパラメーターが含まれます。次に、次のように進みます。

private static final Pattern PATTERN = Pattern.compile("([a-z]+)\\((.*)\\)");

// ...

final Matcher m = Pattern.matcher(input);

if (!m.matches())
    // No match! Deal with it.

// If match, then:

final String identifier = m.group(1);
final String params = m.group(2);

// Test if there is a paren
params.indexOf('(') != -1;

[a-z]+Fortran で使用できる識別子に置き換えます。

于 2013-07-20T05:44:13.713 に答える