正規表現には、バランスの取れた/ネストされたブラケットを解析するのに十分な機能がありません。これは本質的に、正規表現ではなく特別なパーサーを使用するという一貫したアドバイスがある 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 で最後にぶら下がりブラケットや奇妙な文字を使用しないでください。