2010-07-14 62 views
1

我也有類似的字符串C#:如何有效地從預定義的字符串格式中提取值?

例如收集: 串1:客戶的名字是約翰,他的姓是glueck,他的公司名稱爲abc高清technolgies有限責任公司,他有60個dollars.His支出平衡率爲+ 3.45%

串2:客戶的名字是史蒂夫,他的姓是約翰斯頓,他的公司名稱是XYZ公司,他的800個dollars.His消費率的平衡是-212.86%

現在我必須從字符串1和steve,johnston,xyz corporation,800,-212.86中提取像john,glueck,abc def technolgies llc,60,+ 3.45這樣的值字符串2.

在我們的生產環境中,每個字符串都很大,我有大約83個字段從每個字符串中提取。提取這些值的最佳方法是什麼?

是否有任何與string.format相反的方法,它將參考字符串&作爲實際字符串並返回提取的值?

+0

你能提供一個字符串的實際例子嗎?起初,你說它看起來像一個句子,但你給一些逗號分隔的值。 – 2010-07-14 15:44:01

+1

我相信CSV字符串顯示所需的*輸出*。 – 2010-07-14 15:53:12

回答

10

一個正則表達式會做的伎倆。

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 

之後,你可以執行一些簡單的字符串解析從琴絃數值。此外,如果輸入格式有一些變化,您可能必須編寫更健壯的正則表達式。

+0

+1個命名分組的好例子 – Abel 2010-07-14 16:11:35

2

(問題:您實際輸入的字符串是完整的羅嗦的文字:「客戶的名字是XXXX,他的姓是XXXX,他的公司名稱爲xxxx」等正確的?)

的可能是一個很好正則表達式的情況。如果你使用編譯選項,你應該得到合理的速度。這實際上是你詢問的「反向字符串格式」(帶有更多選項)。

UPDATE:

// 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); 
+0

James,Regex似乎是要走的路。你可以請我分享一下我應該用我的例子字符串1的正則表達式嗎? – funwithcoding 2010-07-14 15:56:24

相關問題