在VB.NET中使用正则表达式将文本与数字分开......我很难过

时间:2010-11-07 07:25:22

标签: regex vb.net

我在解析某些文字时遇到问题。以下是文本示例:

   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技能。也许有人可以给我一些指导,这样我就能更好地帮助我的学生。

1 个答案:

答案 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));