e:\中国电影\台湾电影\一席之地\[电影天堂 www.dygod.com]一席之地cd1.rmvb|type=vod&cid=1&hash=0b2d0d529b21eaa6fd653fcac6818ad9&mime=rm&bitrate=543000&size=219681348
e:\中国电影\台湾电影\一席之地\[电影天堂 www.dygod.com]一席之地cd2.rmvb|type=vod&cid=1&hash=ccd4845b60af77f7741575cafc2e938f&mime=rm&bitrate=542000&size=276069792
e:\中国电影\台湾电影\一年之初\一年之初.do.over.2006.dvd-rmvb.rmvb|type=vod&cid=1&hash=0f1506ac2fb49f4eb15a02bc2ff55b90&mime=rm&bitrate=596000&size=513459358上面每一行记录末尾有个'\r'换行符,希望提取“|”之后到换行符前的字符串。
我自己查到的应该是
^\| \r$
然后就卡壳了。
行首到行尾怎么匹配呢?

解决方案 »

  1.   

            private void TestRegex08()
            {
                string yourStr = @"e:\中国电影\台湾电影\一席之地\[电影天堂 www.dygod.com]一席之地cd1.rmvb|type=vod&cid=1&hash=0b2d0d529b21eaa6fd653fcac6818ad9&mime=rm&bitrate=543000&size=219681348
    e:\中国电影\台湾电影\一席之地\[电影天堂 www.dygod.com]一席之地cd2.rmvb|type=vod&cid=1&hash=ccd4845b60af77f7741575cafc2e938f&mime=rm&bitrate=542000&size=276069792
    e:\中国电影\台湾电影\一年之初\一年之初.do.over.2006.dvd-rmvb.rmvb|type=vod&cid=1&hash=0f1506ac2fb49f4eb15a02bc2ff55b90&mime=rm&bitrate=596000&size=513459358
    ";
                MatchCollection mc = Regex.Matches(yourStr, @"(?m)(?<=\|).+");
                foreach (Match m in mc)
                {
                    MessageBox.Show(m.Value);
                }
            }
      

  2.   

    给你解释一下,使得这个帖子本身价值提升为学习而不是解决问题。
    -----------------------------------------------------
    (?m)(?<=\|).+
    -----------------------------------------------------
    (?m)    模式设置,描述意思为后面的表达式,在再次出现模式修改之前,.表示非换行符的所有字符
    模式有很多
    i       忽略大小写
    s       单行模式,.允许匹配回车换行
    m       多行模式,.不允许匹配回车换行
    n       模式名字忘记了,表示取消隐式分组声明,分组一定要写名字,例如(?<name>.)。
    x       表示忽略表达始中的空格
    以上模式可以组合使用,例如
    (?isnx)(?<=\|) 断言,表示后面的匹配,需要先匹配到断言的内容,而断言本身不是匹配的结果。|是关键字,转义为\|.+      既然前面修饰完了,说明.表示非回车换行的任意字符,(?<=\|)表示了.匹配之前的内容需要是|,那剩下的就是.+干的事了。
    可能我描述问题不是很清晰。你凑合看,尽量理解,不理解的详见:
    我师傅过客的博客
    DEELX 正则表达式引擎
      

  3.   


    给你解释一下,使得这个帖子本身价值提升为学习而不是解决问题。
    -----------------------------------------------------
    (?m)(?<=\|).+
    -----------------------------------------------------
    (?m)    模式设置,描述意思为后面的表达式,在再次出现模式修改之前,.表示非换行符的所有字符
    模式有很多
    i       忽略大小写
    s       单行模式,.允许匹配回车换行
    m       多行模式,.不允许匹配回车换行
    n       模式名字忘记了,表示取消隐式分组声明,分组一定要写名字,例如(?<name>.)。
    x       表示忽略表达始中的空格
    以上模式可以组合使用,例如
    (?isnx)(?<=\|) 断言,表示后面的匹配,需要先匹配到断言的内容,而断言本身不是匹配的结果。|是关键字,转义为\|.+      既然前面修饰完了,说明.表示非回车换行的任意字符,(?<=\|)表示了.匹配之前的内容需要是|,那剩下的就是.+干的事了。
    可能我描述问题不是很清晰。你凑合看,尽量理解,不理解的详见:
    我师傅过客的博客
    DEELX 正则表达式引擎
      

  4.   

    很抱歉。想当然回复了。
    模式不知道啊。可能后面的一定要比前面的级别高,或范围广才有效。
    test1234
    afdafda|fda
    43243231如果用(?s).+\|(?m).+这样匹配,结果还是全部都匹配到了。
    test1234
    afdafda|fda
    43243231
    但如果换一下,用(?m).+\|(?s).+匹配,则看上去是模式可以改变的。
    afdafda|fda
    43243231