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

时间:2009-03-12 11:55:50

标签: c# regex parsing plsql

我正在学习正则表达式并需要一些帮助才能从字符串中获取所有可能的匹配项。

如果我输入的是:

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

我需要获得具有以下组的匹配

组别1:

  1. "cond1"
  2. "stmt1;"
  3. 和Group2:

    1. "cond2"
    2. "stmt2;"
    3. 是否可以使用任何正则表达式获取此类组?

3 个答案:

答案 0 :(得分:6)

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

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

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

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

编辑2 :更改了一点regex以在最后一组中包含分号。这不会按照你的意愿工作 - 相反它会给你多个匹配,每个匹配代表一个条件,第一组是条件,第二组语句

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

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

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

它包含一个正向前瞻,以便第二组从然后匹配到下一个'when'或'end'。在我的测试中它适用于此:

case a
when cond1 
then stmt1;
   stm1;
   stm2;stm3
when cond2 
then stmt2;
   aaa;  
   bbb;
end case;

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

答案 1 :(得分:1)

我不认为这是可能的,主要是因为任何匹配的时间......然后......将匹配所有这些组,在同一组中创建多个捕获。

我建议使用这个正则表达式:

(?:when(.*)\nthen(.*)\n)+?

导致:

比赛1:
  *第1组:cond1
  *第2组:stmt1;
比赛2:
  *第1组:cond2
  *第2组:stmt2;

答案 2 :(得分:0)

如果这是用java编写的,我会为解析器编写两种模式,一种用于匹配案例,另一种用于匹配when-then案例。以下是后者的编写方式:

CharSequence buffer = inputString.subSequence(0, inputString.length());
// inputString is the string you get after matching the case statements...

Pattern pattern = Pattern.compile(
    "when (\\S+).*"
    + "then (\\S+).*");

Matcher matcher = pattern.matcher(buffer);
while (matcher.find()) {
    DoWhenThen(matcher.group(1), matcher.group(2));
}

注意:我没有测试过这段代码,因为我对模式并不是100%肯定......但是我会修补这个。