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

标签 c# regex parsing plsql

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

如果我的输入是:

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;

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

关于c# - 正则表达式获取 C# 中模式的所有可能匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/638297/

相关文章:

Javascript 正则表达式只允许最多 10 位数字,不允许字符串和特殊字符

c# - 解析值时遇到意外字符

System.Drawing.Bitmap 中的 C# OutOfMemoryException

javascript - 使用单个正则表达式验证主机名和 IP 地址

java - xml解析中如何判断Nodelist是否有标签?

php - 如何将多个html页面解析为一个字符串?

javascript - JS 解析 JSON。定义时出现未定义错误

c# - 代表的封装问题?

C# 等待函数返回yield break以继续

java - 正则表达式模式(Java)识别oracle with子句的开头