正则表达式:重复捕获组
我必须从ASCII文本文件中解析一些表。 这是一个部分样本:
QSMDRYCELL 11.00 11.10 11.00 11.00 -.90 11 11000 1.212 RECKITTBEN 192.50 209.00 192.50 201.80 5.21 34 2850 5.707 RUPALIINS 150.00 159.00 150.00 156.25 6.29 4 80 .125 SALAMCRST 164.00 164.75 163.00 163.25 -.45 80 8250 13.505 SINGERBD 779.75 779.75 770.00 773.00 -.89 8 95 .735 SONARBAINS 68.00 69.00 67.50 68.00 .74 11 3050 2.077
该表由1列文本和8列浮点数组成。 我想通过正则表达式捕获每一列。
我对正则表达式很陌生。 这是我提出的错误的正则表达式模式:
(\S+)\s+(\s+[\d\.\-]+){8}
但该模式仅捕获第一列和最后一列。 RegexBuddy还会发出以下警告:
您重复了捕获组本身。 该组将仅捕获最后一次迭代。 在重复组周围放置捕获组以捕获所有迭代。
我已经查阅了他们的帮助文件,但我不知道如何解决这个问题。
如何单独捕获每列?
在C#中(从此示例修改):
string input = "QSMDRYCELL 11.00 11.10 11.00 11.00 -.90 11 11000 1.212"; string pattern = @"^(\S+)\s+(\s+[\d.-]+){8}$"; Match match = Regex.Match(input, pattern, RegexOptions.MultiLine); if (match.Success) { Console.WriteLine("Matched text: {0}", match.Value); for (int ctr = 1; ctr < match.Groups.Count; ctr++) { Console.WriteLine(" Group {0}: {1}", ctr, match.Groups[ctr].Value); int captureCtr = 0; foreach (Capture capture in match.Groups[ctr].Captures) { Console.WriteLine(" Capture {0}: {1}", captureCtr, capture.Value); captureCtr++; } } }
输出:
Matched text: QSMDRYCELL 11.00 11.10 11.00 11.00 -.90 11 11000 1.212 ... Group 2: 1.212 Capture 0: 11.00 Capture 1: 11.10 Capture 2: 11.00 ...etc.
不幸的是,你需要重复(…)
8次才能分别得到每一列。
^(\S+)\s+([-.\d]+)\s+([-.\d]+)\s+([-.\d]+)\s+([-.\d]+)\s+([-.\d]+)\s+([-.\d]+)\s+([-.\d]+)\s+([-.\d]+)$
如果可以使用代码,则可以首先将这些数字列作为一个整体进行匹配
>>> rx1 = re.compile(r'^(\S+)\s+((?:[-.\d]+\s+){7}[-.\d]+)$', re.M) >>> allres = rx1.findall(theAsciiText)
然后用空格分割列
>>> [[p] + q.split() for p, q in allres]
如果您想知道警告出现的是什么,那是因为您的捕获组多次匹配(8,如您指定的那样),但捕获变量只能有一个值。 它被分配了匹配的最后一个值。
如问题1313332中所述 ,使用正则表达式检索这些多个匹配通常是不可能的,尽管.NET和Perl 6对它有一些支持。
警告表明你可以在整个集合中放置另一个组,如下所示:
(\S+)\s+((\s+[\d\.\-]+){8})
然后,您将能够看到所有列,但当然它们不会分开。 因为通常不可能单独捕获它们,所以更常见的目的是捕获所有这些,并且警告有助于提醒您这一点。
- IL Emit用于调用委托实例?
- System.Runtime.InteropServices.ComTypes.IStream到System.IO.Stream
- ASP.NET vNext – MissingMethodException:找不到方法:Microsoft.CodeAnalysis.Diagnostic> EmitResult.get_Diagnostics()’
- 如何在XNA中调整和保存Texture2D?
- Visual Studiounit testingAssert.AreEqual失败,具有相同的预期值和实际值
- 在C#中调用javascript函数
- 将byte 作为文件打开而不首先将其实际保存为文件
- 如何使用asp.net mvc视图返回404
- 为什么类型推断和隐式运算符在以下情况下不起作用?