我需要帮助来匹配文本,如下所示:
示例输入:
[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%”
答案 0 :(得分:0)
根据评论,对于第一个发布的示例数据,您可以省略锚点^
并使用3个捕获组:
(?<replace>(?<column>\[[^]]+\]\.\w+)\.Contains\("(?<like>%[^%]+\%)"\))(?: And | Or |$)
说明
(?<replace>
开始组replace
(?<column>
开始组column
\[[^]]+\]
匹配开局[
,超过1次没有关闭]
,然后关闭]
\.\w+
匹配一个点和1个以上的单词字符)
结束组column
\.Contains\("
匹配.contains("
(?<like>)
开始组like
%[^%]+\%
匹配%
,而不是%
匹配1次以上,然后匹配%`)
关闭组like
"\)
匹配")
)
关闭组replace
(?: And | Or |$)
与And
,Or
或字符串结尾匹配的替代项