使用正则表达式匹配模式n次

时间:2011-12-21 02:57:27

标签: .net regex

我一直在编写文件解析器,在解析器中我使用正则表达式解析每一行,如果匹配则我解析数据。

我现在应该承认,我的正则表达式知识充其量只是......

所以我有一行看起来像这样:

( -3456 -3104 344 -24 -10 1 0 0 ) ( -3456 -2976 344 -23 -10 1 0 0 ) ( -3456 -2976 312 -23 -9 1 0 0 ) 

8个浮点值(括号上方,重复n次(上面3个,但我可以更多或更少)。

我试过了:

\( (.*?) \)

解析了括号的内容(然后我使用另一个正则表达式解析),但这也匹配了这样的行:

/* iap 0 */ 4 5 1 ( 176 -1272 120 ) ( 176 -1272 264 ) ( 176 -1416 264 ) ( 176 -1416 120 ) 

我不想要它。我想这是因为我没有指定开始^

但如果我这样做,我似乎只得到第一组括号......

^\( (.*?) \)

我一直在看这个好几个小时,围成一圈,但是很难找到我想要的东西 - 指针/帮助吗?

2 个答案:

答案 0 :(得分:2)

如果要将模式限制为匹配八位数,请尝试以下模式:

string pattern = @"\(\s*(-?\d+(?:\.\d+)?\b\s*){8}\)";

foreach (Match m in Regex.Matches(input, pattern))
{
    Console.WriteLine(m.Value);
}

您可以访问组中捕获的值,而不是使用第二个正则表达式来获取数字。这看起来像这样:

foreach (Match m in Regex.Matches(input, pattern))
{
    Console.WriteLine("Match: " + m.Value);
    foreach (Group g in m.Groups)
    {
        foreach (Capture c in g.Captures)
        {
            Console.WriteLine(c.Value);
        }
    }
    Console.WriteLine();
}

请记住,捕获组中的第一项表示整个匹配,因此如果您不需要它,则可以跳过它(使用for循环和从1开始的索引)。

模式细分:

  • \(\s*:文字(和空格(任意数量的重复)
  • -?\d+(?:\.\d+)?:可选的否定符号,一个或多个数字,以及可选的小数点后跟数字(后一部分位于非捕获组中,因为它位于(?: ...)
  • \b\s*:字边界,以确保匹配在每个数字后结束,后跟零个或多个空格字符
  • 模式的最后两部分位于捕获组中,因为它们括在括号中
  • {8}:重复8次
  • \):文字)

答案 1 :(得分:1)

这样可以区分你的例子:

^(\([0-9. -]+\) *)+$

它正在寻找一组或多组括号(括号),其中只有数字,空格,连字符(减号)和小数点。它还允许集合之间的空白,并要求它们占用整行。如果你需要它只专门匹配八个数字的集合,那将看起来有点不同。