匹配字符前的平衡括号
Matching balanced parentheses before a character
我需要在 c# 中的文字句点之前匹配平衡括号内的字符串。当字符串中有额外的开放括号时,我的平衡组正则表达式工作 except 。根据我的理解,这需要一个条件失败模式来确保堆栈在匹配时为空,但有些地方不太正确。
原始正则表达式:
@"(?<Par>[(]).+(?<-Par>[)])\."
有失败模式:
@"(?<Par>[(]).+(?<-Par>[)])(?(Par)(?!))\."
测试代码(最后 2 个失败):
string[] tests = {
"a.c", "",
"a).c", "",
"(a.c", "",
"a(a).c", "(a).",
"a(a b).c", "(a b).",
"a((a b)).c", "((a b)).",
"a(((a b))).c", "(((a b))).",
"a((a) (b)).c", "((a) (b)).",
"a((a)(b)).c", "((a)(b)).",
"a((ab)).c", "((ab)).",
"a)((ab)).(c", "((ab)).",
"a(((a b)).c", "((a b)).",
"a(((a b)).)c", "((a b))."
};
Regex re = new Regex(@"(?<Par>[(]).+(?<-Par>[)])(?(Par)(?!))\.");
for (int i = 0; i < tests.Length; i += 2)
{
var result = re.Match(tests[i]).Groups[0].Value;
if (result != tests[i + 1]) throw new Exception
("Expecting: " + tests[i + 1] + ", got " + result);
}
您可以使用众所周知的正则表达式来匹配平衡的括号,并在其后附加一个 \.
:
\((?>[^()]+|(?<o>)\(|(?<-o>)\))*(?(o)(?!))\)\.
|---------- balanced parens part ----------|.|
参见regex demo。
详情
\(
- (
(?>
- 原子组的开始
[^()]+
- (
和 )
以外的 1 个或多个字符
|
- 或
(?<o>)\(
- 开局 (
被推到组 o
堆栈
|
- 或
(?<-o>)\)
- 关闭 (
从组 o
堆栈中弹出
)*
- 原子团重复 0 次或多次
(?(o)(?!))
- 如果组 o
堆栈不为空则匹配失败
\)
- 一个 )
\.
- 一个点。
我需要在 c# 中的文字句点之前匹配平衡括号内的字符串。当字符串中有额外的开放括号时,我的平衡组正则表达式工作 except 。根据我的理解,这需要一个条件失败模式来确保堆栈在匹配时为空,但有些地方不太正确。
原始正则表达式:
@"(?<Par>[(]).+(?<-Par>[)])\."
有失败模式:
@"(?<Par>[(]).+(?<-Par>[)])(?(Par)(?!))\."
测试代码(最后 2 个失败):
string[] tests = {
"a.c", "",
"a).c", "",
"(a.c", "",
"a(a).c", "(a).",
"a(a b).c", "(a b).",
"a((a b)).c", "((a b)).",
"a(((a b))).c", "(((a b))).",
"a((a) (b)).c", "((a) (b)).",
"a((a)(b)).c", "((a)(b)).",
"a((ab)).c", "((ab)).",
"a)((ab)).(c", "((ab)).",
"a(((a b)).c", "((a b)).",
"a(((a b)).)c", "((a b))."
};
Regex re = new Regex(@"(?<Par>[(]).+(?<-Par>[)])(?(Par)(?!))\.");
for (int i = 0; i < tests.Length; i += 2)
{
var result = re.Match(tests[i]).Groups[0].Value;
if (result != tests[i + 1]) throw new Exception
("Expecting: " + tests[i + 1] + ", got " + result);
}
您可以使用众所周知的正则表达式来匹配平衡的括号,并在其后附加一个 \.
:
\((?>[^()]+|(?<o>)\(|(?<-o>)\))*(?(o)(?!))\)\.
|---------- balanced parens part ----------|.|
参见regex demo。
详情
\(
-(
(?>
- 原子组的开始[^()]+
-(
和)
以外的 1 个或多个字符
|
- 或(?<o>)\(
- 开局(
被推到组o
堆栈|
- 或(?<-o>)\)
- 关闭(
从组o
堆栈中弹出
)*
- 原子团重复 0 次或多次(?(o)(?!))
- 如果组o
堆栈不为空则匹配失败\)
- 一个)
\.
- 一个点。