2017-07-24 63 views
-3

我有一個這樣的字符串 -劈裂串多個條件

query = "UserId:(\"787D01FE-D108-4C83-A2E2-4B1DA3166A5C\" OR \"CCA47A4F-B4FA-405C-B34E-EC2E0B1F374C\") AND CreatedDate:[2017-06-20T06:14:11Z TO 2017-07-20T06:14:11Z] OR FirstName: Abc "; 

但我想要得到的結果陣列這樣的 -

queries= 
{ 
    [0] UserId:(\"787D01FE-D108-4C83-A2E2-4B1DA3166A5C\" OR \"CCA47A4F-B4FA-405C-B34E-EC2E0B1F374C\") 
    [1] AND 
    [2] CreatedDate:[2017-06-20T06:14:11Z TO 2017-07-20T06:14:11Z] 
    [3] OR 
    [4] FirstName: Abc 
} 

更新:

所以遠遠我用過 -

 var result = 
        (from Match m in Regex.Matches(query , @"\[[^]]*]|\{[^}]*}|[^:]+") 
         select m.Value) 
         .ToArray(); 

但與此結束 -

enter image description here

SOLUTION:

基於由@NetMage建議的解決方案,我增加了一些變化,以照顧雙引號的,條件在括號內Here

UserId : ("787D01FE-D108-4C83-A2E2-4B1DA3166A5C" OR "CCA47A4F-B4FA-405C-B34E-EC2E0B1F374C") AND CreatedDate : [ 2017-06-20T06:14:11Z TO 2017-07-20T06:14:11Z ] AND (FirstName : "Abc" OR LastName : "Xyz") 

正則表達式 -

(?:\w+?\s*:\s*(\(.+?\)|\".+?\"|\[.+?\]|\w+))|(?:\(\w+?\s*:\s*(\(.+?\)|\".*?\"*|\[.+?\]|\w+)\))|([A-Z]+([A-Z]+)?) 
+0

看看string.Split:https://msdn.microsoft.com/en-us/library/1bwe3zdy(v=vs.110).aspx – Neil

+0

我已經通過這個走了,但不能找到了解決方案。最好提出答案 –

+0

你試過了什麼?最好修復你的非工作代碼,而不是提供你已經嘗試過的東西。 – Neil

回答

2

這是如何工作的?

var pattern = @"(?:\w+? ?: ?(\(.+?\)|\[.+?\]|\w+))|([A-Z]+([A-Z]+)?)"; 

var ans = Regex.Matches(query, pattern).Cast<Match>().Select(m => m.Value).ToArray(); 
+0

偉大的解決方案!我添加了一些變體 - (?:\ w +?\ s *:\ s *(\(。+?\)| \「。+?\」| \ [。+?\] | \ w +)) |([AZ] +([AZ] +)?)|(?:\(\ w +?\ s *:\ s *(\(。+?\)| \「。+?\」| \ [。 ?+ \] | \ w +)\)) –