2016-01-20 100 views
0

我有這個字符串:從列表創建數組的優雅方式是什麼?

"(Id=7) OR (Id=6) OR (Id=8)" 

從上面的字符串我怎樣才能創建數組或列表如下:

"Id=6" 
"Id=7" 
"Id=8" 
+0

你是否試圖在'('和')'字符之間捕獲正則表達式,並將它們放入'string []'中? –

+0

['\(([^)] *)\)'](https://regex101.com/r/eM1dB0/1)全局標誌,並訪問捕獲組1 – Tushar

+0

似乎有理由問你想如何對待任何AND?或者也許不可能有任何其他分隔符而不是OR。 – Marcus

回答

3

不使用正則表達式,但與一些LINQ的,你可以寫

string test = "(Id=7) OR (Id=6) OR (Id=8)"; 
var result = test 
    .Split(new string[] { " OR "}, StringSplitOptions.None) 
    .Select(x => x = x.Trim('(', ')')) 
    .ToList(); 

如果您還需要考慮考慮的存在和運營商或空格之間的可變數目AND/OR和條件,那麼你可以將代碼更改爲這一個

string test = "(Id=7) OR (Id=6) OR (Id=8)"; 
var result = test 
    .Split(new string[] { "OR", "AND"}, StringSplitOptions.None) 
    .Select(x => x = x.Trim('(', ')', ' ')) 
    .ToList(); 
+0

如果''''和'OR'之間有超過1個空格會怎麼樣? –

+0

刪除OR周圍的空格並添加一個空格字符到修剪 – Steve

+0

是的,但我覺得可能會有更多* if * s通常更易於使用正則表達式進行調整。 –

1

只要抓住比賽

(?<=\()[^)]*(?=\)) 

觀看演示。

https://regex101.com/r/iJ7bT6/18

string strRegex = @"(?<=\()[^)]*(?=\))"; 
Regex myRegex = new Regex(strRegex, RegexOptions.Multiline); 
string strTargetString = @"(Id=7) OR (Id=6) OR (Id=8)"; 

foreach (Match myMatch in myRegex.Matches(strTargetString)) 
{ 
    if (myMatch.Success) 
    { 
    // Add your code here 
    } 
} 
+1

兩點:1)由於您可以使用組,所以不需要週轉,2)摘錄不會產生列表作爲結果。 –

+0

@WiktorStribiżew製作清單應該是一項簡單的任務 – vks

+0

是的,我展示瞭如何在我的答案中完成。 「OfType」還有另一種LINQ方式,BTW。 –

3

我建議結合正則表達式和LINQ權力:

var result = Regex.Matches(input, @"\(([^()]+)\)") 
     .Cast<Match>() 
     .Select(p => p.Groups[1].Value) 
     .ToList(); 

\(([^()]+)\)模式(see its demo)將匹配所有(...)字符串,並使用組1(轉義(...)內)來構建最終名單。

相關問題