如何为重复模式生成正则表达式

时间:2014-12-08 10:57:52

标签: c# regex

美好的一天!我正在研究LOLCODE的翻译,我在这方面遇到了麻烦:

SMOOSH "A" AN "B" AN "C" AN "D"

我需要得到字符串文字A,B,C,D,但我只得到第一个和最后两个文字。

这是我的代码:

 r = new Regex(@"(\s+)?(?<smoosh>SMOOSH)\s+(\""(?<yarn1>[^\""]+).*)\s+(\""(?<yarn2>[^\""]+).*)(\s+)?((\s+)(AN)?(\""(?<yarn3>[^\""]+).*))+(\s+)?(?<comment>BTW\s*.*\s*)?$");

我需要保存所有的字符串文字,以便以后可以连接它。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

试试这个:

Regex re = new Regex(@"""(.*?)""");
MatchCollection mc = re.Matches(sourcestring);
      int mIdx=0;
      foreach (Match m in mc)
       {
        for (int gIdx = 0; gIdx < m.Groups.Count; gIdx++)
          {
            Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames()[gIdx], m.Groups[gIdx].Value);
          }
        mIdx++;
      }

您将获得数组中的所有文字。

答案 1 :(得分:0)

您可以使用捕获组。

@"""([^""]*)"""

从组索引1中获取所需的字符串。

Regex rgx = new Regex(@"""([^""]*)""");
foreach (Match m in rgx.Matches(input))
Console.WriteLine(m.Groups[1].Value);

OR

使用\G锚点。\G断言上一场比赛结束时的位置或第一场比赛的字符串开头。它仅在包含字符串SMOOSH

的行上抓取双引号内的值
@"(?:(?:\s+)?(?<smoosh>SMOOSH)\s+|(?<!^)\G) *(?:AN)* *""?([^""\n]*)""?"

代码:

String input = @"SMOOSH ""A"" AN ""B"" AN ""C"" AN ""D""";
Regex rgx = new Regex(@"(?:(?:\s+)?(?<smoosh>SMOOSH)\s+|(?<!^)\G) *(?:AN)* *""?([^""\n]*)""?");
foreach (Match m in rgx.Matches(input))
Console.WriteLine(m.Groups[1].Value);

IDEONE