【问题标题】:C# Regex - Match comma delimited list of tuplesC# Regex - 匹配逗号分隔的元组列表
【发布时间】: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) 是允许的。

标签: c# regex


【解决方案1】:

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

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

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

{(a,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 在 cmets 中建议的解析器。

【讨论】:

  • 我应该提到 n 元组的元素可以是任何不包含逗号的文本。我已经编辑了我的示例,并在原始帖子的末尾添加了一个 EDIT
  • @nam 只需将 \w 更改为 [^,(){}](尽管您可能希望进一步限制字符集,因为它允许其余的 Unicode 存在)。
  • @ataravati 你说得对,这很复杂。我已将您的回复标记为答案,因为至少到目前为止它适用于我的案例。
  • @nhahtdh 感谢您的建议。它适用于我的示例,但您说得对,我可能不得不进一步限制字符集;否则,它可能不适用于某些情况。
  • @nam,不客气。顺便说一句,您可能还需要考虑大括号和圆括号之间的空白。
猜你喜欢
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多