我在解析某些文字时遇到问题。以下是文本示例:
201 BBQ 0.000 9.000 0.099 0.891 9.000 0.000 0.000 0.000
705 W 1 PC 0.000 135.000 0.295 39.825 0.000 0.000 135.000 0.000
2106 ONL 9.99 41.141 3.000 4.110 12.330 3.000 0.000 0.000 29.970
以下是我一直在尝试的代码的最新版本:
objInfo = System.Text.RegularExpressions.Regex.Split(
newLine,"(\d{3,5})|([0-9]+[.]+[0-9]+)|(\w*)")
我遇到了麻烦,因为我在拆分后避免在阵列中获得许多空格。我试图避免使用可选的|
字符,但是在没有它的情况下设置它时我没有得到任何结果!
我花了很多时间来审查正则表达式,并且我已经下载了以下程序:
RegEx Designer.NET Antix RegEx Tester 快报
我遇到了麻烦,因为描述中包含小数点有时候,有时却没有。描述有时包含整数,有时则不包含。
我的朋友建议我使用awk将其分成列。问题是......我用Visual Basic .Net教授社区教育课程,我需要提高我的RegEx技能。也许有人可以给我一些指导,这样我就能更好地帮助我的学生。
答案 0 :(得分:2)
由于你知道列的数量,你可以从行的末尾读取8位小数,然后将其余的作为标题。你可以避免使用正则表达式,但这是一个简单的解决方案:
Match match = Regex.Match(line, @"^(.*)((?:\d+\.\d+\s*){8})$");
string title = match.Groups[1].Value.Trim();
IEnumerable<decimal> numbers = match.Groups[2].Value
.Split(" \t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
.Select(Convert.ToDecimal);
正则表达式捕获两组:((?:\d+\.\d+\s*){8})$
最后是八位小数,而(.*)
是直到它们的刺激的开始。如果你有额外的小数,作为你的第三个例子,他们将被添加到标题。
同样,你可以选择一个非正则表达式解决方案(实际上,如果你不介意在title
丢失一些空格,那么这个解决方案会更好):
string[] words = line.Split(" ".ToCharArray(),
StringSplitOptions.RemoveEmptyEntries);
int position = words.Count() - 8;
IEnumerable<decimal> numbers = words.Skip(position).Select(Convert.ToDecimal);
string title = String.Join(" ", words.Take(position));