我有类似字符串的集合
例如: 字符串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相反的方法,它接受参考字符串&实际的字符串并返回提取的值?
答案 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);