我一直在编写文件解析器,在解析器中我使用正则表达式解析每一行,如果匹配则我解析数据。
我现在应该承认,我的正则表达式知识充其量只是......
所以我有一行看起来像这样:
( -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 )
我不想要它。我想这是因为我没有指定开始^
但如果我这样做,我似乎只得到第一组括号......
^\( (.*?) \)
我一直在看这个好几个小时,围成一圈,但是很难找到我想要的东西 - 指针/帮助吗?
答案 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. -]+\) *)+$
它正在寻找一组或多组括号(括号),其中只有数字,空格,连字符(减号)和小数点。它还允许集合之间的空白,并要求它们占用整行。如果你需要它只专门匹配八个数字的集合,那将看起来有点不同。