string str = "var stock_str='万  科A,8.83,8.80,2009-05-05,15:05:28';";问题1
只用正则,如何得到如下匹配(注意日期时间中有逗号)
万  科A
8.83
8.80
2009-05-05,15:05:28问题2
只用正则,能否得到下面的匹配(不使用Replace,SubString等string方法)
万  科A
8.83
8.80
2009-05-05 15:05:28

解决方案 »

  1.   

    问题1好办,问题2也就是问题的限制版。既然加了限制,那就只能使用Match来实现了,我想知道匹配的项目是否只有4个?看样子应该是固定数目的,那样就容易实现Match匹配,不固定个数要实现Match虽然也可以,但是效率很低,还不如用Replace。
      

  2.   

    把单引号里面的内容匹配出来,这个用正则比较方便里面的内容再用逗号分隔(String.Split),分隔出来变成一个长度为5的字符串数组要想取哪部分很容易就弄出来了,干嘛非要用正则呢
      

  3.   

    这么简单的东西就一定要用正则吗?Split(',') 不是最简单的解决方案,不要把简单的问题复杂化
      

  4.   

    我的字符串经常都是不一样的,比如,可能会有中间用分号隔开的var stock_str='Xxx;8.83;8.80;2009-05-05 15:05:28';
    所以我希望保存正则表达式到数据库,根据字符串的不同能选择不同的表达式来分析。所以一定要用正则
      

  5.   

    都是逗号分的,直接split更快的吧
      

  6.   


    还不如替换一下split的分隔符
      

  7.   

    以后可能还会有其他格式的字符串,用Replace、SubString无法适应新的情况
      

  8.   

    给出两种情况,第一种是日期时间用空格分割,第二种是日期时间用逗号分割。其它情况自己稍微照着调整下就可以了,很快的。——满足问题二的要求了吧。            string str1 = "var stock_str='万  科A,8.83,8.80,2009-05-05 15:05:28';";
                Match m1 = Regex.Match(str1, @".+?'([^,]*?),([^,]*?),([^,]*?),([^,]*)'");
                if (m1.Success)
                {
                   MessageBox.Show(m1.Groups[1].Value+System.Environment.NewLine+
                       m1.Groups[2].Value+System.Environment.NewLine+
                       m1.Groups[3].Value+System.Environment.NewLine+
                       m1.Groups[4].Value);
                }            string str2 = "var stock_str='万  科A,8.83,8.80,2009-05-05,15:05:28';";
                Match m2 = Regex.Match(str2, @".+?'([^,]*?),([^,]*?),([^,]*?),([^,]*),([^,]*)'");
                if (m2.Success)
                {
                    MessageBox.Show(m2.Groups[1].Value + System.Environment.NewLine +
                        m2.Groups[2].Value + System.Environment.NewLine +
                        m2.Groups[3].Value + System.Environment.NewLine +
                        m2.Groups[4].Value + " " + m2.Groups[5].Value);
                }
      

  9.   


    我的网站会用到别的网站提供的股票数据,比如现在使用 http://www.xxx.com/股票代码,
    可以得到上面的股票信息,但这个网站不一定永远都开着,返回的字符串也不一定永远都不变,
    我不想把代码写死,我希望
    一旦字符串格式变了,我修改一下数据库中的正则表达式就可以了
    一旦网站挂了,我修改网站地址和正则表达式
      

  10.   

    那是捕获匹配,自然需要设定匹配项了,有多少项就需要设定多少项,善用复制粘贴的话,40几项也问题不大。如果觉得看起来太长了,那还是用Replace算了,因为你要除去的部分有共同性,而保留的项却都不一样,所以除去不需要的方便些。(Replace的方法需要给出吗?)
      

  11.   


    1      ^([\u4e00-\u9fa5\sAB]*)|(?<=\d\.\d\d\,\d\.\d\d\,)([0-9\.\-\:\,]*)$|([0-9\.]*)2      ^([\u4e00-\u9fa5\sAB]*)|([0-9\.\-\:]*)
      

  12.   

    抱歉 测试的时候 只测试       '万  科A,8.83,8.80,2009-05-05,15:05:28'没有 测试 var stock_str='万  科A,8.83,8.80,2009-05-05,15:05:28';现在改好了  第二个的 日期 和 时间 只能 做到 分开匹配 想不出 和到一起的办法
    (?<=')[\u4e00-\u9fa5\sA]*|(?<=\d\.\d\d\,\d\.\d\d\,)([0-9\.\-\:\,]*)|([0-9\.]*)
    (?<=')[\u4e00-\u9fa5\sA]*|([0-9\.\-\:]*)
      

  13.   


    增加了匹配 string str = "var stock_str='万  科A,18.83,18.80,2009-05-05,15:05:28';";的 
    应该好了的
    (?<=')[\u4e00-\u9fa5\sA]*|(?<=\d+\.\d\d\,\d+\.\d\d\,)([0-9\.\-\:\,]*)|([0-9\.]*)
    (?<=')[\u4e00-\u9fa5\sA]*|([0-9\.\-\:]*)
      

  14.   


    using System;
    using System.Text.RegularExpressions;namespace regextest
    {
        class Program
        {
            static void Main(string[] args)
            {
                string temp = "var stock_str='万  科A,1.83,0.80,2800-12-10,15:05:28;'";
                Regex rx = new Regex("^.+'(?<name>.+),(?<price1>(?(?=[1-9])[1-9][\\d]*|0)\\.\\d{2}),(?<price2>(?(?=[1-9])[1-9][\\d]*|0)\\.\\d{2}),(?<date>((?(?=1)19\\d{2}|[2-9]\\d{3}))-(?(?=0)0[1-9]|1[0-2])-[0-3]\\d),(?<time>\\d{2}:\\d{2}:\\d{2});'$");
                MatchCollection mcfinal = rx.Matches(temp);
                GroupCollection gcfinal;
                foreach (Match mfinal in mcfinal)
                {
                    gcfinal = mfinal.Groups;
                    Console.WriteLine(gcfinal["name"].Value);
                    Console.WriteLine(gcfinal["price1"].Value);
                    Console.WriteLine(gcfinal["price2"].Value);
                    Console.WriteLine(gcfinal["date"].Value);
                    Console.WriteLine(gcfinal["time"].Value);
                }
                Console.ReadKey();
            }
        }
    }试试
      

  15.   


    //问题一:
    "(?<=')([^,]+),([^,]+),([^,]+),([^']+)"  //Group[1-4] 即为所求
    /*
    Group[1].Value: 万  科A 
    Group[2].Value: 8.83 
    Group[3].Value: 8.80 
    Group[4].Value: 2009-05-05,15:05:28 
    */
    //问题二:
    //正则表达式是匹配连续的字符串 要想将不连续的字符串拼接 只能在匹配后再操作
    "(?<=')([^,]+),([^,]+),([^,]+),([^,]+),([^,]+)"  
    /*
    Group[1].Value: 万  科A 
    Group[2].Value: 8.83 
    Group[3].Value: 8.80 
    Group[4].Value + " " + Group[5].Value: 2009-05-05,15:05:28 */
      

  16.   


    //问题一:
    "(?<=')([^,]+),([^,]+),([^,]+),([^']+)"  //Group[1-4] 即为所求
    /*
    Group[1].Value: 万  科A 
    Group[2].Value: 8.83 
    Group[3].Value: 8.80 
    Group[4].Value: 2009-05-05,15:05:28 
    */
    //问题二:
    //正则表达式是匹配连续的字符串 要想将不连续的字符串拼接 只能在匹配后再操作
    "(?<=')([^,]+),([^,]+),([^,]+),([^,]+),([^,]+)"  
    /*
    Group[1].Value: 万  科A 
    Group[2].Value: 8.83 
    Group[3].Value: 8.80 
    Group[4].Value + " " + Group[5].Value: 2009-05-05 15:05:28 */