正则问题(非初级问题)

boss_george 2014-11-05 02:15:02
源字符串
<PicUrl>6701adb8-86a4-43d3-8fc6-bb11c66ad438</PicUrl>

<PicUrl><![CDATA[6701adb8-86a4-43d3-8fc6-bb11c66ad438]]></PicUrl>


要求
匹配以上2种格式

1.<???????>开头对应的</??????>结尾
2.如果<???????>后面跟的是<![CDATA[,则在</??????>之前必须是]]>,不可以匹配下面这样情况:
<PicUrl><![CDATA[6701adb8-86a4-43d3-8fc6-bb11c66ad438</PicUrl>

3.最终匹配结果只要6701adb8-86a4-43d3-8fc6-bb11c66ad438这样的中间一段

我自己已经实现了这个正则如下:
(?<=<(PicUrl)>(?<cdata><!\[CDATA\[)?)[^<>\[\]]+?(?(cdata)(?=\]\]>\s*</\1>)|(?=\s*</\1>))


虽然实现了,使用了判定表达式,但是美中不足的是,使得表达式实现的关键并非判定表达式,如果使用
(?<=<(PicUrl)>(?<cdata><!\[CDATA\[)?).+?(?(cdata)(?=\]\]>\s*</\1>)|(?=\s*</\1>))

则条件2会无法实现,错误数据也会匹配到。
...全文
162 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wj2012 2014-11-05
  • 打赏
  • 举报
回复
(\w+-\w+-\w+-\w+-\w+)
boss_george 2014-11-05
  • 打赏
  • 举报
回复
这里不考虑嵌套,最终的判定格式是:
(?i)(?<=<(PicUrl)>(?<cdata><!\[CDATA\[)?)((?!<!\[CDATA\[)(?!\]\]>).)+(?=(?<-cdata>\]\]>)?(?(cdata)(?!)|\s*</\1>))
boss_george 2014-11-05
  • 打赏
  • 举报
回复
结贴吧。已经明白怎么回事了 如果字符串是 <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)不起作用了,不是不起作用,而是为了整个表达式的成立,所以和我预期的顺序不同,我忽略了回溯的可能。 明白了,等会儿晚上结贴。
boss_george 2014-11-05
  • 打赏
  • 举报
回复
既然是问正则问题,自然只需要答案。至于项目中是否需要这么做的原因不在此帖讨论范围。我也说了,我已经实现功能了。 只是纠结“正则”问题,一个讨论而已,就事论事的讨论,至于这里是否适合用正则,其实你们不说,我就不知道了么?呵呵。 那另开一个帖子讨论你们想讨论的问题好了。 如何存储和读取XML节点(非完整XML)
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
在csdn上整天纠结“正则”之前,你想过“这真的是正则问题”了吗?
同意,明明是有现成的解决方案,一定要另辟蹊径.
smthgdin_020 2014-11-05
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
在csdn上整天纠结“正则”之前,你想过“这真的是正则问题”了吗?
+1
  • 打赏
  • 举报
回复
在csdn上整天纠结“正则”之前,你想过“这真的是正则问题”了吗?
  • 打赏
  • 举报
回复
你爱怎样玩儿是你的事儿,但是你应该从这里就知道一个事实:如果一个技术经理需要某程序员会很初级地处理 xml 消息,遇到你这种“正则问题(非初级问题)”的做法,他会哭的,也会彻底失望的。 告诉你,遇到 xml 问题就使用 xml 解析程序,遇到 html 问题就使用 html 解析程序,遇到什么 json 问题就使用 json 解析程序,不要整天像小孩子“用泥土做炒勺和饭菜一样过家家”式地纠结什么“正则”。你用正则处理一点点自己想出来的领域问题,这不会保证让你快速学会 xml 处理技能的。
sunny906 2014-11-05
  • 打赏
  • 举报
回复

            MatchCollection mc = Regex.Matches(txt, @"(?i)<((?!>).)+>(?<value>[a-z0-9-]+)</((?!>).)+>|<((?!>).)+><\!\[cdata\[(?<value>((?!]).)+)\]\]></((?!>).)+>");
            foreach (Match m in mc)
            {
                Console.WriteLine(m.Groups["value"].Value);
            }
boss_george 2014-11-05
  • 打赏
  • 举报
回复
关键就是 (?(cdata)(?=\]\]>\s*</\1>)|(?=\s*</\1>)) 这个判定表达式,为毛没起作用…
_小黑_ 2014-11-05
  • 打赏
  • 举报
回复

(?<=<PicUrl><!\[CDATA\[|<PicUrl>)[^<![CDATA[][\s\S]*?(?=\]\]></PicUrl>|</PicUrl>)
phommy 2014-11-05
  • 打赏
  • 举报
回复
<(.+)>(?:<!\[CDATA\[(?<a>[^<>\[\]]+)\]\]>|(?<a>[^<>\[\]]+))</\1>

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧