1

内のすべてに一致する正規表現を知りたい{}です。文字列にはネストされた{};が含まれる場合があります。私はそれらを気にしません。

文字列の例:{Don't} trust me. I'm a {very very {evil}} good guy.

Don't結果をとにしたいvery very {evil}

現時点で私が持っている唯一の正規表現は、/{\w+}/これだけをキャプチャするものevilです。Dontアポストロフィがない場合も返します。

4

2 に答える 2

5

中括弧がネストされているため、中括弧の間の部分を抽出する正規表現は次のようにまっすぐではありません: - \{.+?\}。この正規表現は、最初}に見つかった時点で停止します。そのため、ネストされたブレースに対しては適切に動作しません。そのためには、もう少し複雑な正規表現が必要です。ただし、この種の問題には正規表現を使用しないことをお勧めします。正規表現は、一致する括弧のペアを考慮するのに十分ではありません。通常の言語のみを解析できます。それ以上のものについては、独自のパーサーを作成する必要があります。

そうは言っても、この正規表現を試すことができます:-

"/\{((?:[^{}]*\{[^{}]*\})*[^{}]*?)\}/"

を取得しgroup 1ます。バランスが取れていれば、ネストされたブレースが考慮されます。そして、実際の文字列の一部として中括弧を持っていません。


上記のソリューションとは別に、特定のケースで機能するこのサンプルパーサーを見ることができます。実際、バランスの取れたブレースがある場合、これはネストされたブレースのどの形式でも機能するはずです。

String str = "{Don't} trust me. I'm a {very very {evil}} good guy.";

List<String> words = new ArrayList<>();
int openCount = 0;

StringBuilder builder = new StringBuilder();

for (int i = 0; i < str.length(); i++) {
    char ch = str.charAt(i);

    if (ch == '{') {
        if (openCount == 1) {
            builder.append(ch);
        }
        openCount += 1;

    } else if (ch == '}') {

        if (openCount > 1) {
            openCount--;
            builder.append(ch);

        } else {
            words.add(builder.toString());
            openCount--;
            builder = new StringBuilder();
        }

    } else {
        if (openCount >= 1) {
            builder.append(ch);
        }
    }
}

System.out.println(words);

出力: -

[Don't, very very {evil}]
于 2013-02-05T18:43:02.853 に答える
0

@Rohitは正しいです。

js または java を使用し、ネストされたブラケットの深さを使用しない場合は、独自のパーサーを作成する必要があります。

ただし、C# または perl を使用する場合は、"balancing group" を使用してこれを実現できます。これは高度な正規表現機能であり、js ではサポートされていません。:(

于 2013-02-06T06:53:22.950 に答える