Skip to main content
 首页 » 编程设计

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

2024年01月26日28xiaohuochai

我正在学习正则表达式,需要从字符串中获取模式的所有可能匹配项。

如果我的输入是:

case a 
when cond1  
then stmt1; 
when cond2  
then stmt2; 
end case; 

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

第 1 组:

  1. “cond1”
  2. “stmt1;”

和第 2 组:

  1. “cond2”
  2. “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; 

目前它是区分大小写的,所以如果您需要不区分大小写,您需要添加相应的正则表达式标志。