【发布时间】:2015-10-27 13:41:43
【问题描述】:
我正在尝试匹配由 {...} 括起来的子字符串,其中内部内容是一组 n 元组,每个元组以逗号分隔(示例如下所示)。正则表达式模式获得预期结果,但并未完全表达所需的完整规则。
规则
-
大括号:由
{...}括起来的子字符串,但没有嵌套的子大括号,例如{ ... {..}} -
逗号:元素
{(a,b)(t,s),(u,v)}不在匹配项中,因为它在(a,b)和(t,s)之间缺少一个逗号。 -
元组:n 元组的元素可以是任何不包含逗号、大括号或圆括号的文本。例如:
(a,b, test element)可以,但(a,b, {ab})不行
但是使用的正则表达式模式不太好用。
例如,如果我将{(a,b)(t,s),(u,v)} 中的逗号移动到{(a,b),(t,s)(u,v)},则此元素显示为匹配,即使现在元组(t,s) 和(u,v) 没有被分隔逗号。
有效结果
{(a,b,c),(d,e,f),(r,s 和 q,t),(u,v,y)}
{(a,b),(c,d,e)}
{(a,b),(c+1,d)}
string st =
"abc+{(a,b,c),(d,e,f),(r,s and q,t),(u,v,y)}+c-{(a,b)(t,s),(u,v)}+e+{(a,b),(c,d,e)}+rst+{(a,b),(c,d)}";
Regex oRegex = new Regex(@"{\([^\)\(]+\)[,]+\(.*?\)}");
foreach (Match mt in oRegex.Matches(st))
Console.WriteLine(mt.Value);
【问题讨论】:
-
看起来您正在尝试解析一种语言,而不是可以通过正则表达式轻松解析的东西。您最好使用具有自己语法的完整解析器github.com/picoe/Eto.Parse
-
您确定任何不包含逗号的文本吗?像
(a,b, {ab})这样的东西会匹配吗? -
@ataravati 好点。没有嵌入的大括号或括号。例如。也没有像 (a,b, (ab)) 这样的东西。让我更新我的帖子。
-
我们可以假设它应该是任何字母数字字符+空格吗?
-
@ataravati 它可以包含除逗号、括号和大括号之外的任何键盘字符。例如。 (a,b, c + 1) 是允许的。