我正在学习正则表达式,需要从字符串中获取模式的所有可能匹配项。
如果我的输入是:
case a
when cond1
then stmt1;
when cond2
then stmt2;
end case;
我需要得到具有如下分组的比赛
第 1 组:
“cond1”
“stmt1;”
和第 2 组:
“cond2”
“stmt2;”
是否可以使用任何正则表达式获得此类组?
最佳答案
只要您不嵌套语句,就可以为此使用正则表达式。例如,如果您的 stmt1 是另一个 case 语句,那么所有赌注都将关闭(您不能将正则表达式用于类似的东西,您需要一个常规的解析器)。
编辑:如果你真的想尝试它,你可以用类似的东西来做(没有测试,但你明白了):
Regex t = new Regex(@"when\s+(.*?)\s+then\s+(.*?;)", RegexOptions.Singleline)
allMatches = t.Matches(input_string)
但正如我所说,这仅适用于非嵌套语句。
编辑 2:稍微更改了正则表达式以在最后一组中包含分号。这不会按您想要的那样工作 - 相反,它会给您多个匹配项,每个匹配项将代表一个 when 条件,第一组是条件,第二组 group 是语句.
我认为您无法构建完全符合您要求的正则表达式,但这应该足够接近(我希望如此)。
编辑 3:新正则表达式 - 应该处理多个语句
Regex t = new Regex(@"when\s+(.*?)\s+then\s+(.*?)(?=(when|end))", RegexOptions.Singleline)
它包含一个积极的前瞻,以便第二组从then 匹配到下一个“when”或“end”。在我的测试中,它适用于此:
case a
when cond1
then stmt1;
stm1;
stm2;stm3
when cond2
then stmt2;
aaa;
bbb;
end case;
目前它是区分大小写的,所以如果您需要不区分大小写,您需要添加相应的正则表达式标志。
关于c# - 正则表达式获取 C# 中模式的所有可能匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/638297/