C#:如何有效地从预定义的字符串格式中提取值?

时间:2010-07-14 15:40:22

标签: c# .net

我有类似字符串的集合

例如: 字符串1:客户的第一个名字是john,他的姓氏是glueck,他的公司名称是abc def technolgies llc,他的余额为60美元。他的支出率是+ 3.45%

字符串2:客户的第一个名字是史蒂夫,他的姓是约翰斯顿,他的公司名称是xyz公司,他的余额为800美元。他的支出率是-212.86%

现在我必须从字符串1和steve,johnston,xyz corporation,800,-212.86中提取字符串2中的john,glueck,abc def technolgies llc,60,+ 3.45等值。

在我们的生产环境中,每个字符串都非常大,我从每个字符串中提取大约83个字段。提取这些值的最佳方法是什么?

是否有任何与string.format相反的方法,它接受参考字符串&实际的字符串并返回提取的值?

2 个答案:

答案 0 :(得分:11)

正则表达式可以解决问题。

namespace ConsoleApplication
{
    using System;
    using System.Text.RegularExpressions;

    internal static class Program
    {
        private static void Main()
        {
            var expression = new Regex(
                @"Customer's first Name is (?<FirstName>[^,]+), " +
                @"his last name is (?<LastName>[^,]+), " +
                @"his company name is (?<CompanyName>[^,]+), " +
                @"he has a balance of (?<Balance>[0-9]+) dollars\. " +
                @"His spending rate is (?<SpendingRate>[^%]+)%");

            var line = @"Customer's first Name is john, his last name is glueck, his company name is abc def technolgies llc, he has a balance of 60 dollars. His spending rate is +3.45%";

            var match = expression.Match(line);

            Console.WriteLine("First name......{0}", match.Groups["FirstName"]);
            Console.WriteLine("Last name.......{0}", match.Groups["LastName"]);
            Console.WriteLine("Balance.........{0}", match.Groups["Balance"]);
            Console.WriteLine("Spending rate...{0}", match.Groups["SpendingRate"]);

            Console.ReadLine();
        }
    }
}

<强>输出

First name......john
Last name.......glueck
Balance.........60
Spending rate...+3.45

之后,您可以执行一些简单的字符串解析来从字符串中获取数值。此外,如果输入格式存在一些变化,您可能必须编写更强大的正则表达式。

答案 1 :(得分:2)

(问题:你的实际输入字符串是完整的罗嗦文字:“客户的第一个名字是xxxx,他的姓氏是xxxx,他的公司名称是xxxx”等等。正确吗?)

这可能是正则表达式的一个好例子。如果你使用编译选项,你应该得到一个合理的速度。这本质上是你所询问的“反向字符串格式”(有更多选项)。

更新:

  // NOTE: pattern assumes a comma after spending rate
  Regex regex = new Regex("Customer's first Name is (\w+), his last name is (\w+),his company name is ([\w\s]+), he has a balance of (\d+) dollars.His spending rate is ([^,]+)");

  string[] values = regex.Split(string1);