我需要在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& #39; ,在这些情况下,捕获组不应包含任何内容。我在下面提供了一些示例,说明这种情况何时无效但需要。
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#代码。
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 :(得分:0)
试试这个:
^(\w+):(.+?)(?:\s*:\s*(NoClause|NoWhereClause))?$
您需要将最后一部分设为可选。此外,您需要在中间使用延迟匹配,以避免将最后一组的内容捕获到中间组。