<(.+)>(?:<!\[CDATA\[(?<a>[^<>\[\]]+)\]\]>|(?<a>[^<>\[\]]+))</\1>

解决方案 »

  1.   


    (?<=<PicUrl><!\[CDATA\[|<PicUrl>)[^<![CDATA[][\s\S]*?(?=\]\]></PicUrl>|</PicUrl>)
      

  2.   

    关键就是
    (?(cdata)(?=\]\]>\s*</\1>)|(?=\s*</\1>))
    这个判定表达式,为毛没起作用…
      

  3.   


                MatchCollection mc = Regex.Matches(txt, @"(?i)<((?!>).)+>(?<value>[a-z0-9-]+)</((?!>).)+>|<((?!>).)+><\!\[cdata\[(?<value>((?!]).)+)\]\]></((?!>).)+>");
                foreach (Match m in mc)
                {
                    Console.WriteLine(m.Groups["value"].Value);
                }
      

  4.   

    你爱怎样玩儿是你的事儿,但是你应该从这里就知道一个事实:如果一个技术经理需要某程序员会很初级地处理 xml 消息,遇到你这种“正则问题(非初级问题)”的做法,他会哭的,也会彻底失望的。告诉你,遇到 xml 问题就使用 xml 解析程序,遇到 html 问题就使用 html 解析程序,遇到什么 json 问题就使用 json 解析程序,不要整天像小孩子“用泥土做炒勺和饭菜一样过家家”式地纠结什么“正则”。你用正则处理一点点自己想出来的领域问题,这不会保证让你快速学会 xml 处理技能的。
      

  5.   

    在csdn上整天纠结“正则”之前,你想过“这真的是正则问题”了吗?
      

  6.   

    既然是问正则问题,自然只需要答案。至于项目中是否需要这么做的原因不在此帖讨论范围。我也说了,我已经实现功能了。
    只是纠结“正则”问题,一个讨论而已,就事论事的讨论,至于这里是否适合用正则,其实你们不说,我就不知道了么?呵呵。那另开一个帖子讨论你们想讨论的问题好了。
    如何存储和读取XML节点(非完整XML)
      

  7.   

    结贴吧。已经明白怎么回事了
    如果字符串是
    <PicUrl><![CDATA[6701adb8-86a4-43d3-8fc6-bb11c66ad438</PicUrl>
    (?<cdata><!\[CDATA\[)?
    表达式匹配,但分组捕获成功。
    所以认为应该是
    (?(cdata)(\]\]>\s*</\1>)|(?=\s*</\1>))
    执行yes段:(\]\]>\s*</\1>),发现不存在]]>,整个表达式结果应当是失配的,但正则表达式的一个关键是为了匹配,所以此时并不会返回失配,而是会回溯,让cdata分组失配,使用.+?匹配,则可以执行no段的表达式
    尝试使用no段:(?=\s*</\1>)
    结果就导致了整个表达式的匹配。这就是我自己误解的为什么(?(exp)yes|no)不起作用了,不是不起作用,而是为了整个表达式的成立,所以和我预期的顺序不同,我忽略了回溯的可能。明白了,等会儿晚上结贴。
      

  8.   

    这里不考虑嵌套,最终的判定格式是:(?i)(?<=<(PicUrl)>(?<cdata><!\[CDATA\[)?)((?!<!\[CDATA\[)(?!\]\]>).)+(?=(?<-cdata>\]\]>)?(?(cdata)(?!)|\s*</\1>))