2017-03-29 59 views
0

我需要在C#中創建一個正則表達式模式,它能夠接受一個字符串,捕獲3個組,最終組只能捕獲字符串以'NoClause'。我在下面提供了一個示例輸入以及我希望3個捕獲組包含的內容。使用正則表達式在行尾的條件匹配

樣品輸入:

Header:Select * From TableName WHERE ColumnName = '53 : ABC' ORDER BY NoClause : NoClause

所需的輸出:

Group1: 'Header' 
Group2: 'Select * From TableName WHERE ColumnName = '53 : ABC'' 
Group3: 'NoClause' 

我到目前爲止的模式是:

(\w+):{1}(.+)\s*:\s*(NoClause)

現在對於當字符串格式化作爲樣本我輸入,這確實工作但我遇到的問題是當輸入字符串不包含':NoClause',在這些情況下,捕獲組應該不包含任何內容。我在下面提供了這個不起作用但需要的示例。

Header:select * from TableName where ColumnName = '1 ABC' 
Header:select * from TableName where ColumnName = '1: ABC' 
Header:select * from TableName where ColumnName = '1: ABC' OR ColumnName = '2: DFG' OR ColumnName = '3: HIJ' 

當使用上述模式時,什麼也沒有捕獲。我試圖使用'?'作爲一個條件,但我不能讓它匹配所有情況。

我一直在擺弄這一切在https://regex101.com/r/wG3aM3/261

需要考慮的事項

  1. 當使用這個模式中,輸入的只有一個字符串將被一次處理 ,不例如四個獨立的輸入一次
  2. 處理我有C#代碼都準備好了,只需要正則表達式模式就可以使它 工作
  3. 輸入字符串有時會包含0個或更多的分號(:) 但它只是在最後的分號之後我希望它捕獲 'NoClause'
  4. 這需要支持邊界情況,其中ColumnName或值是'NoClause',非常不可能,但需要支持這種情況。

感興趣的是,下面是我的C#代碼。

Match parameters = Regex.Match(inputString, @"(\w+):{1}(.+)\s*:\s*(NoClause)", RegexOptions.IgnoreCase); 

var group1 = parameters.Groups[1].Value; 
var group2 = parameters.Groups[2].Value; 
bool group3 = parameters.Groups[3].Success; 

回答

0

有這一個嘗試:

^(\w+):(.+?)(?:\s*:\s*(NoClause|NoWhereClause))?$ 

你需要做的最後一部分是可選的。此外,您還需要在中間使用惰性匹配,以避免將最後一組的內容捕獲到中間。

+0

謝謝!似乎正在工作!我稍微編輯它,以不捕獲不必要的組。 ^(\ w +):(。+?)(?:\ s *:\ s *(NoClause))?$'(驗證在https://regex101.com/r/wG3aM3/262) – Trozza

+0

奇怪,我在C#項目中使用了這個,單元測試失敗了。試過另一個在線工具來幫助調試,結果與之前不一樣,因爲它根本不捕獲第三組,想法呢? [RegexStorm測試結果](http://regexstorm.net/tester?p=%5e%28%5cw%2b%29%3a%28。%2B%3F%29%28%3F%3A%5CS *%3A%5CS *%28NoClause%29%29%3F%24&I =部首%3aselect + * +從+%23%23HeaderTest +其中+ MultiLineText +%3D +%271%圖3a + ABC%27 + OR + MultiLineText +%3D +%272%3A + DFG%27 + OR + MultiLineText +%3D +%273%3A + HIJ%27 +%3A ++++++++++++++ ++++++ NoWhereClause&o = i) – Trozza

+0

您的失敗單元測試包含'NoWhereClause'而不是'NoClause',這在原文中沒有提到。我調整了正則表達式。 –