正则表达式为C#中的模式获取所有可能的匹配

Arc*_*hie 1 c# regex parsing plsql

我正在学习正则表达式并需要一些帮助来获得字符串模式的所有可能匹配.

如果我的输入是:

case a
when cond1 
then stmt1;
when cond2 
then stmt2;
end case;
Run Code Online (Sandbox Code Playgroud)

我需要获得具有如下组的比赛

组别1:

  1. "cond1"
  2. "stmt1;"

和Group2:

  1. "cond2"
  2. "stmt2;"

是否可以使用任何正则表达式获得此类组?

rsl*_*ite 6

如果您没有嵌套语句,则可以使用正则表达式.例如,如果你的stmt1是另一个案例的声明,那么所有的赌注都是关闭的(你不能使用正则表达式,你需要一个常规的解析器).

编辑:如果你真的想尝试它,你可以用类似的东西(没有经过测试,但你明白了):

Regex t = new Regex(@"when\s+(.*?)\s+then\s+(.*?;)", RegexOptions.Singleline)
allMatches = t.Matches(input_string)
Run Code Online (Sandbox Code Playgroud)

但正如我所说,这只适用于非嵌套语句.

编辑2:改变了一点正则表达式,在最后一组中包含分号.这将无法正常工作,你想要的-而不是它会给你多比赛,每场比赛将代表一个的条件,与第一组的条件和第二的发言.

我认为你不能建立一个完全符合你想要的正则表达式,但这应该足够接近(我希望).

编辑3:新的正则表达式 - 应该处理多个语句

Regex t = new Regex(@"when\s+(.*?)\s+then\s+(.*?)(?=(when|end))", RegexOptions.Singleline)
Run Code Online (Sandbox Code Playgroud)

它包含一个正向前瞻,以便第二组从那时开始匹配到下一个'时'或'结束'.在我的测试中它适用于此:

case a
when cond1 
then stmt1;
   stm1;
   stm2;stm3
when cond2 
then stmt2;
   aaa;  
   bbb;
end case;
Run Code Online (Sandbox Code Playgroud)

现在它区分大小写,因此如果您需要不区分大小写,则需要添加相应的正则表达式标志.