C#Regex - 匹配逗号分隔的元组列表

时间:2015-08-05 00:04:02

标签: c# regex

我正在尝试匹配{...}所包围的子字符串,其中内部内容是一组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)和{ {1}}未以逗号分隔。

有效结果

  

{(a,b,c),(d,e,f),(r,s和q,t),(u,v,y)}

     

{(A,B),(C,d,E)}

     

{(A,B),(C + 1,d)}

(u,v)

1 个答案:

答案 0 :(得分:0)

你的表情有更多问题。以下内容也会显示为匹配项,我不认为这是您想要的内容:

  

{(a,b),(c,d)}

     

{(A,B),,(C,d,E)}

     

{(一,ABCD),(ABCD,B)}

试试这个:

Regex oRegex = new Regex(@"{\(\w(,\w)*\)(,\(\w(,\w)*\))*}");

<强>更新 如果n元组的元素可以是任何不包含逗号或大括号或括号的文本,那么你可以试试这个:

Regex oRegex = new Regex(@"{\([^,(){}]+(,[^,(){}]+)*\)(,\([^,(){}]+(,[^,(){}]+)*\))*}");

而且,如果元组之间逗号周围的空格很好(例如{(a,b), (c,d)}),那么你可以使用它:

Regex oRegex = new Regex(@"{\([^,(){}]+(,[^,(){}]+)*\)(\s*,\s*\([^,(){}]+(,[^,(){}]+)*\))*}");

然而,这似乎比你想象的要复杂得多。我建议您尝试使用解析器,如Matthew Lock在评论中所建议的那样。