使用正则表达式对行尾的字符串进行条件匹配

时间:2017-03-29 21:44:13

标签: c# regex

我需要在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处摆弄这一切。

需要考虑的事项

  1. 使用此模式时,只会处理一个输入字符串 一次,而不是一次处理四个单独的输入
  2. 我已经准备好了C#代码,只需要正则表达式就可以了 工作
  3. 输入字符串有时会包含0个或更多的分号(:) 但是只有在最后的分号之后我才想捕获它 ' NoClause'
  4. 这需要支持边缘情况,其中ColumnName或值为“NoClause'”,非常不可能,但无论如何都需要支持此情况。
  5. 有兴趣,下面是我的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;
    

1 个答案:

答案 0 :(得分:0)

试试这个:

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

您需要将最后一部分设为可选。此外,您需要在中间使用延迟匹配,以避免将最后一组的内容捕获到中间组。