我有一个很好的正则表达式,适用于我的大多数情况:
"\(.*\)"
此正则表达式匹配嵌套括号,这是好的:“ABC (DEF(GHI)JKL) MNO”
但是有一个棘手的案例:“这是ABC (XXX)DEF(XXX)(XXX)”。正如你所看到的,这个正则表达式也匹配DEF,但它没有。
关于如何调整我的正则表达式的任何想法?
答案 0 :(得分:1)
如果不坚持正常表达式,您可以放置一个简单的基于堆栈的实现:
using System.Linq;
...
private static IEnumerable<string> EnumerateEnclosed(string value) {
if (null == value)
yield break;
Stack<int> positions = new Stack<int>();
for (int i = 0; i < value.Length; ++i) {
char ch = value[i];
if (ch == '(')
positions.Push(i);
else if (ch == ')')
if (positions.Any()) {
int from = positions.Pop();
if (!positions.Any()) // <- outmost ")"
yield return value.Substring(from, i - from + 1);
}
}
}
测试:
// Let's combine both examples into one and elaborate it a bit further:
string test = "ABC (DEF (GHI) J(RT(123)L)KL) MNO (XXX1) DEF (XXX2) (XXX3)";
Console.WriteLine(string.Join(Environment.NewLine, EnumerateEnclosed(test)));
结果:
(DEF (GHI) J(RT(123)L)KL)
(XXX1)
(XXX2)
(XXX3)
答案 1 :(得分:0)