C#正则表达式:多次匹配捕获组

时间:2018-11-04 11:53:50

标签: c# regex

我需要帮助来匹配文本,如下所示:

示例输入:

[Table1].Name.Contains("%Test%") And ([Table1].Name.Contains("%Test2%") Or [Table1].Name.Contains("%Test3%"))
([Table1].Name.Contains("%Test%") Or [Table1].Name.Contains("%Test2%")) And [Table1].Name.Contains("%Test3%") 

应将“与”和“或”之间的不同部分视为要识别的主要文本,而应忽略所有其他文本,例如括号。在此示例中,我想解析3个可识别的字符串,但是可以不包含任何字符串,也可以包含多个字符串,并且可以将它们括在多个括号中或不包含在括号中。

因此在上面的示例中,我需要标识3个字符串:

[Table1].Name.Contains("%Test%")
[Table1].Name.Contains("%Test2%")
[Table1].Name.Contains("%Test3%")

到目前为止的正则表达式:

^(?<replace>(?<column>.*?)(?:\.Contains\("(?<like>.*?)"\)))(.*)$

到目前为止,我只能捕获第一个字符串,直到“ And”为止,但我也想捕获到最后两个字符串。我一直在寻找正面/负面的前瞻性/后视性,但我无法确定。

匹配来自https://regex101.com/的信息

Match 1
Full match  0-107   `[Table1].Name.Contains("%Test%") And [Table1].Name.Contains("%Test2%") Or [Table1].Name.Contains("%Test3%")`
Group `replace` 0-32    `[Table1].Name.Contains("%Test%")`
Group `column`  0-13    `[Table1].Name`
Group `like`    24-30   `%Test%`
Group 4.    32-107  ` And [Table1].Name.Contains("%Test2%") Or [Table1].Name.Contains("%Test3%")`

对于上面的输入,如果可能的话,我希望有3个“替换”组,3个“列”组和3个“喜欢”组。

所以对于输出,我希望每3组有3个匹配项,所以: 匹配1,将具有replace =“ [Table1] .Name.Contains(”%Test%“)”,column =“ [Table1] .Name”和replace =“%Test%” 匹配2将具有replace =“ [Table1] .Name.Contains(”%Test2%“)”,column =“ [Table1] .Name”和replace =“%Test2%” 匹配3,将具有replace =“ [Table1] .Name.Contains(”%Test3%“)”,column =“ [Table1] .Name”和replace =“%Test3%”

1 个答案:

答案 0 :(得分:0)

根据评论,对于第一个发布的示例数据,您可以省略锚点^并使用3个捕获组:

(?<replace>(?<column>\[[^]]+\]\.\w+)\.Contains\("(?<like>%[^%]+\%)"\))(?: And | Or |$)

Demo

说明

  • (?<replace>开始组replace
    • (?<column>开始组column
      • \[[^]]+\]匹配开局[,超过1次没有关闭],然后关闭]
      • \.\w+匹配一个点和1个以上的单词字符
    • )结束组column
    • \.Contains\("匹配.contains("
    • (?<like>)开始组like
      • %[^%]+\%匹配%,而不是%匹配1次以上,然后匹配%`
    • )关闭组like
    • "\)匹配")
  • )关闭组replace
  • (?: And | Or |$)AndOr或字符串结尾匹配的替代项