簡體   English   中英

使用正則表達式在行的末尾條件匹配字符串

[英]Conditional matching of a string at the end of the line using regex

我需要在C#中創建一個Regex模式,該模式可以接收字符串,捕獲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#代碼,只需要Regex模式即可使其工作
  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;

試試這個:

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

您需要將最后一部分設為可選。 另外,您需要在中間使用惰性匹配,以避免將最后一組的內容捕獲到中間。

暫無
暫無

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

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