簡體   English   中英

C#正則表達式-匹配以逗號分隔的元組列表

[英]C# Regex - Match comma delimited list of tuples

我正在嘗試匹配由{...}括起來的子字符串,其中內部內容是一組由逗號分隔的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);

您的表情還有更多問題。 以下內容也將顯示為匹配項,我認為這不是您想要的:

{(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建議的解析器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM