0

これは文字列です:

String str = "(S(B1)(B2(B21)(B22)(B23))(B3)())";

son-() のコンテンツは、""、または str の値、またはそのパターンのように、再帰的になる可能性があるため、sub-() はサブツリーです。

期待される結果:

str1 is "(S(B1))"
str2 is "(B2(B21)(B22)(B23))" //don't expand sons of a son
str3 is "(B3)"
str4 is "()"

str1-4 は、たとえば配列内の要素です

文字列を分割するには?

おなじみの質問があります: Java 正規表現でこの文字列を分割する方法は? しかし、その答えはこれには十分ではありません。

4

1 に答える 1

1

正規表現には、バランスの取れた/ネストされたブラケットを解析するのに十分な機能がありません。これは本質的に、正規表現ではなく特別なパーサーを使用するという一貫したアドバイスがある HTML などのマークアップ言語の解析と同じ問題です。

これをツリーとして解析する必要があります。全体的には:

  • スタックを作成します。
  • 「(」を押すと、次のチャンクがスタックにプッシュされます。
  • ")" を押すと、スタックがポップされます。

これを記述するには数分かかり、入力が整形式であるかどうかがチェックされます。

これにより、ほとんどすぐに時間を節約できます。このために正規表現を管理しようとすると、ますます複雑になり、ほぼ必然的に機能しなくなります。

更新: 1 つのレベルのみに関心がある場合は、より簡単にすることができます (デバッグなし):

List<String> subTreeList = new ArrayList<String>();
String s = getMyString();
int level = 0;
int lastOpenBracket = -1
for (int i = 0; i < s.length(); i++) {
    char c = s.charAt(i);
    if (c == '(') {
        level++;
        if (level == 1) {
            lastOpenBracket = i;
        }
    } else if (c == ')') {
        if (level == 1) {
            subStreeList.add(s.substring(lastOpenBracket, i);
        }
        level--;
    }
}

I haven't checked it works, and you should debug it. You should also put checks to make sure you 

レベル == 1 で最後にぶら下がりブラケットや奇妙な文字を使用しないでください。

于 2013-04-22T07:09:29.210 に答える