FARE CNY 9160   
TAX CNY 90CN CNY 122BP CNY 92XT   
TOTAL CNY 9464   
19SEP10SHA KE X/SEL Q43.91CA TPE626.65KE X/SEL Q45.92KE SHA6   
26.65NUC1341.14END ROE6.829940   
XT CNY 64TW CNY 28YQ  
用你的:
MatchCollection mc = Regex.Matches(test, @"(?<key>FARE CNY|TOTAL CNY|TAX|ROE)([^\d\r\n]*(?<value>\d+(\.\d+)?))+|(?<key>\bQ)\D*(?<value>\d+(\.\d+)?)(((?!\bQ)[^\r\n])*)+(?<key>\bQ)(?<value>\d+(\.\d+)?)");
        foreach (Match m in mc)
        {
            Console.Write(m.Groups["key"].Value + "=");
            bool head = false;
            foreach (Capture c in m.Groups["value"].Captures)
            {
                if (head) Console.Write(","); 
                Console.Write(c.Value);
                if (!head) head = true;
            }
            Console.WriteLine();
        }
没有问题,但是碰到下面的格式,ROE取不出来,CPU占用及高.
XHKG YOW             NVB      NVA19AUG 20K                                      
 TPE FOW             NVB      NVA19AUG 40K                                      
FARE  CNY    6880                                                               
TAX   CNY     90CN CNY     86YQ CNY     86YR                                    
TOTAL CNY    7142                                                               
19AUG10SHA MU X/HKG317.71CX TPE Q4.23 684.70NUC1006.64END RO                    
E6.829940                                                                       
ENDOS PENALTY APPLYS能够用用5个正则表达式.一个一个取出来.
FARE CNY=9160  
TOTAL CNY=9464
TAX=90,122,92   
Q=43.91,45.92 //Q后面的数字
ROE=6.829940  

解决方案 »

  1.   

     
    正则问题Java版问火龙果,C#版问yazhe~,
      

  2.   


        private static void TestRegex09()
        {
            string test = @"XHKG YOW NVB NVA19AUG 20K   
     TPE FOW NVB NVA19AUG 40K   
    FARE CNY 6880   
    TAX CNY 90CN CNY 86YQ CNY 86YR   
    TOTAL CNY 7142   
    19AUG10SHA MU X/HKG317.71CX TPE Q4.23 684.70NUC1006.64END RO   
    E6.829940   
    ENDOS PENALTY APPLYS";
            MatchCollection mc = Regex.Matches(test, @"(?<key>FARE CNY|TOTAL CNY|TAX|ROE)([^\d\r\n]*(?<value>\d+(\.\d+)?))+|(?<key>\bQ)(?<value>\d+(\.\d+)?)(((?!\bQ)[^\r\n])*(?<key>\bQ)(?<value>\d+(\.\d+)?))*");
            foreach (Match m in mc)
            {
                Console.Write(m.Groups["key"].Value + "=");
                bool head = false;
                foreach (Capture c in m.Groups["value"].Captures)
                {
                    if (head) Console.Write(",");
                    Console.Write(c.Value);
                    if (!head) head = true;
                }
                Console.WriteLine();
            }
        }当时弄糊涂了,多了一点东西。
      

  3.   

     SHA                                                                            
     TPE YRT             NVB      NVA29AUG 20K                                      
     SHA YRT             NVB      NVA29AUG 20K                                      
    FARE  CNY    6450                                                               
    TAX   CNY     90CN CNY     64TW CNY    336YQ                                    
    TOTAL CNY    6940                                                               
    29AUG10SHA MU TPE472.18MU SHA472.18NUC944.36END ROE6.829940                     
    ENDOS PENALTY APPLYS                                                            
    TKT/TL29AUG10               如果这样用你新的方法,多取出了29,10.
    刚刚测试.
      

  4.   

    没有多啊。结果是
    FARE CNY=6880
    TAX=90,86,86
    TOTAL CNY=7142
    Q=4.23
      

  5.   

     用下面的文本,多了.   
     TPE YRT NVB NVA29AUG 20K   
     SHA YRT NVB NVA29AUG 20K   
    FARE CNY 6450   
    TAX CNY 90CN CNY 64TW CNY 336YQ   
    TOTAL CNY 6940   
    29AUG10SHA MU TPE472.18MU SHA472.18NUC944.36END ROE6.829940   
    ENDOS PENALTY APPLYS   
    TKT/TL29AUG10  
      

  6.   

    public static string GetValue(string text,string tag, bool repeat_with_tag)
    {
        string pattern = string.Format(repeat_with_tag ? @"(?<key>{0})(?<value>\d+(\.\d+)?)(((?!{0})[^\r\n])*(?<key>{0})(?<value>\d+(\.\d+)?))*" : @"(?<key>{0})([^\d\r\n]*(?<value>\d+(\.\d+)?))+", (tag.Length == 1 ? @"\b" : "") + Regex.Escape(tag));
        StringBuilder result_builder = new StringBuilder();
        MatchCollection mc = Regex.Matches(text, pattern);
        foreach (Match m in mc)
        {
            result_builder.Append(m.Groups["key"].Value + "=");
            bool head = false;
            foreach (Capture c in m.Groups["value"].Captures)
            {
                if (head) result_builder.Append(",");
                result_builder.Append(c.Value);
                if (!head) head = true;
            }
        }
        return result_builder.ToString();
    }调用方法    static void Main(string[] args)
        {
            string test = @"XHKG YOW NVB NVA19AUG 20K   
     TPE FOW NVB NVA19AUG 40K   
    FARE CNY 6880   
    TAX CNY 90CN CNY 86YQ CNY 86YR   
    TOTAL CNY 7142   
    19AUG10SHA MU X/HKG317.71CX TPE Q4.23 684.70NUC1006.64END RO   
    E6.829940   
    ENDOS PENALTY APPLYS";
            Console.WriteLine(GetValue(test, "Q", true));
            Console.WriteLine(GetValue(test, "TAX CNY", false));
            Console.WriteLine(GetValue(test, "E", false));
            Console.ReadKey();
        }
      

  7.   

    结果
    Q=4.23
    TAX CNY=90,86,86
    E=6.829940