我需要在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。
需要考慮的事項
- 當使用這個模式中,輸入的只有一個字符串將被一次處理 ,不例如四個獨立的輸入一次
- 處理我有C#代碼都準備好了,只需要正則表達式模式就可以使它 工作
- 輸入字符串有時會包含0個或更多的分號(:) 但它只是在最後的分號之後我希望它捕獲 'NoClause'
- 這需要支持邊界情況,其中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;
謝謝!似乎正在工作!我稍微編輯它,以不捕獲不必要的組。 ^(\ w +):(。+?)(?:\ s *:\ s *(NoClause))?$'(驗證在https://regex101.com/r/wG3aM3/262) – Trozza
奇怪,我在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
您的失敗單元測試包含'NoWhereClause'而不是'NoClause',這在原文中沒有提到。我調整了正則表達式。 –