c#中正则表达式的匹配问题

Anew_G 2012-03-03 02:22:15
我想匹配<div id="XXX">和 YYY</a> 之间的内容

XXX可以是不定长的数字 比如2343或45945等等 YYY是几个中文

我的正则表达式是这样的 (?<=<div\u0020id=\u0022\d+\u0022)[^YYY]+") 这个表达式刚好可以匹配出<div id="XXX">和YYY之间的内容。

我更改了下,变成这样 (?<=<div\u0020id=\u0022\d+\u0022)[^YYY</a>]+") 为什么就不行了呢?

\u0020 \u0022是空格和双引号
...全文
860 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Anew_G 2012-03-03
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sxldfang 的回复:]

这样试试:

Regex.Matchs(html,@"(?is)(?<=<div\s+id=""\d+"">).*?(?=程序员</a></div>)));
[/Quote]

你的也可以 感谢 多了几个括号 呵呵
Anew_G 2012-03-03
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 lxcnn 的回复:]

引用 17 楼 anew_g 的回复:
我的意思就是想定位到以“XXXXX”和“YYYYY”之间的字符串内容,XXXXX和YYYYY是我自己定的。

(?is)(?<=XXXXX)(?:(?!YYYYY).)*(?=YYYYY)
[/Quote]

搞定!
-过客- 2012-03-03
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 anew_g 的回复:]
我的意思就是想定位到以“XXXXX”和“YYYYY”之间的字符串内容,XXXXX和YYYYY是我自己定的。[/Quote]

(?is)(?<=XXXXX)(?:(?!YYYYY).)*(?=YYYYY)
Anew_G 2012-03-03
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lxcnn 的回复:]

这个是你要的结果吗?
C# code
string test = "<div id=\"232314\">dfdsfa<a href=\"a.html\">程序员</a></div>";
Regex reg = new Regex(@"(?is)(?<=<div\s*id=""232314"">(?:(?!</div).)*)<a[^>]*>.*?</a>");
Match m = reg.……
[/Quote]

我的意思就是想定位到以“XXXXX”和“YYYYY”之间的字符串内容,XXXXX和YYYYY是我自己定的。
基拉 2012-03-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yysyangyangyangshan 的回复:]
用正则表达式截取指定字符之间的内容,参考最后一段

或参考网页抓取
[/Quote]

顶上。楼主解决问题了吗?!
-过客- 2012-03-03
  • 打赏
  • 举报
回复
这个是你要的结果吗?
string test = "<div id=\"232314\">dfdsfa<a href=\"a.html\">程序员</a></div>";
Regex reg = new Regex(@"(?is)(?<=<div\s*id=""232314"">(?:(?!</div).)*)<a[^>]*>.*?</a>");
Match m = reg.Match(test);
if (m.Success)
{
richTextBox2.Text = m.Value;
}
/*-----输出-----
<a href="a.html">程序员</a>
*/
Anew_G 2012-03-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lxcnn 的回复:]

刚看到10楼的例子,用下面的正则提取其中的链接

C# code
(?is)(?<=<div\s*id="232314">(?:(?!</div).)*)<a[^>]*>.*?</a>
[/Quote]

嗯 以前我都理解错了 谢谢讲解

另外,你给的例子里(?<=<div\s*id="232314">(?:(?!</div).)*)<a[^>]*>.*?</a>是不是打错了,匹配失败

要排除字符串,需要用到环视(?!</a>) 比如10L的例子 我要排除"程序员</a>"这个字符串
环视(?!</a>)里面的内容要怎么打?
sxldfang 2012-03-03
  • 打赏
  • 举报
回复
这样试试:

Regex.Matchs(html,@"(?is)(?<=<div\s+id=""\d+"">).*?(?=程序员</a></div>)));
-过客- 2012-03-03
  • 打赏
  • 举报
回复
刚看到10楼的例子,用下面的正则提取其中的链接

(?is)(?<=<div\s*id="232314">(?:(?!</div).)*)<a[^>]*>.*?</a>
-过客- 2012-03-03
  • 打赏
  • 举报
回复
楼主首先要认识你一个错误,[^YYY]和[^YYY</a>]这种写法是不对的,[]字符组,能够匹配所包含的一系列字符中的任意一个。需要注意的是,[]虽然能匹配其中的任意一个字符,但匹配的结果只能是一个字符,不是多个。

同样的[^]排除型字符组,它所排除的也只是一些无序的字符,而不能排除一个有序字符序列,也就是字符串
要排除字符串,需要用到环视(?!</a>)

另外,要解决问题,你需要给出要匹配的字符串的具体的例子

参考
[ ] 字符组(Character Classes)
Anew_G 2012-03-03
  • 打赏
  • 举报
回复
比如说这样一个例子:
<div id="232314">dfdsfa<a href="a.html">程序员</a></div>

我用 (?<=<div\u0020id=\u0022\d+\u0022)[^程序员]+") 就能把dfdsfa<a href="a.html">给匹配出来。

我现在是怕出现这种情况:

<div id="232314">dfd程序员<a href="a.html">程序员</a></div>

我刚刚的正则表达式就匹配到第一个程序员就停止了,我需要的<a href="a.html">没有匹配出来,所以我改成 (?<=<div\u0020id=\u0022\d+\u0022)[^程序员</a>]+") 希望能精确匹配到第二个程序员。但是什么都没匹配到

[^ABC]+ 我觉得应该就是一旦发现字符串ABC就在那里停止,否则不停止。不知道我是不是理解错了
yhmni 2012-03-03
  • 打赏
  • 举报
回复
写个具体的例子
Anew_G 2012-03-03
  • 打赏
  • 举报
回复
我想匹配<div id="XXX">和 YYY</a> 之间的内容。

(?<=<div\u0020id=\u0022\d+\u0022)[^YYY</a>]+")

我把</a>去掉

变成(?<=<div\u0020id=\u0022\d+\u0022)[^YYY]+")

就成功了 匹配出了<div id="XXX">和 YYY 之间的内容

为什么加了个</a>就匹配不出来了呢?
Anew_G 2012-03-03
  • 打赏
  • 举报
回复
目前为止没1个是匹配成功的。。。。
Anew_G 2012-03-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yysyangyangyangshan 的回复:]

用正则表达式截取指定字符之间的内容,参考最后一段

或参考网页抓取
[/Quote]

谢了!收了以后继续学习 这次比较急用,先放着
yangzhi070 2012-03-03
  • 打赏
  • 举报
回复

按楼主的意思,建议这么写:

(?:<div\s+id="\d+"\s*>)(?<match>.*)(?:YYY</a>)

匹配结果取名为match的匹配项

这个能严格限制 "<div id="XXX">匹配内容YYY</a>" 中要抓取内容两端的字符串
porschev 2012-03-03
  • 打赏
  • 举报
回复



Regex re = new Regex("(?<=<div\\s*id=\"\\d+\">)[^YYY]+(?=YYY)", RegexOptions.None);

huangwenquan123 2012-03-03
  • 打赏
  • 举报
回复
            string str = @"<div id=""123456"">和 YYY</a>";
Regex reg = new Regex(@"(?is)(?<=<div\s*id=""\d+"">).*?(?=YYY</a>)");
Console.WriteLine(reg.Match(str).Value);
huangwenquan123 2012-03-03
  • 打赏
  • 举报
回复
            string str = @"<div id=""123456"">和 YYY</a>";
Regex reg = new Regex(@"(?is)(?<=<div\s*id=""\d+"">)(?:(?!YYY</a>).)*");
Console.WriteLine(reg.Match(str).Value);
C#,我们一般使用Regex类来表示一个正则表达式。一般正则表达式引擎支持以下3种匹配模式:单行模式(Singleline)、多行模式(Multiline)与忽略大小写(IgnoreCase)。 1. 单行模式(Singleline) MSDN定义:更改点 (.) 的含义,使它与每一个字符匹配(而不是与除 \n 之外的每个字符匹配)。 使用单行模式的典型场景是获取网页源码的信息。 示例: 我们使用WebBrowser控件,从http://www.xxx.com/1.htm上获取了如下HTML源码,它存储在变量str: <html> <body>
随着互联网的迅速发展,几乎所有工具软件和程序语言都支持的正则表达式也变得越来越强大和易于使用。《精通正则表达式(第3版)》是讲解正则表达式的经典之作。《精通正则表达式(第3版)》主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校措施,并详细介绍了在Perl、Java、.NET、PHP正则表达式的用法。 《精通正则表达式(第3版)》自第1版开始着力于教会读者 "以正则表达式来思考",来让读者真正"精通"正则表达式。该版对PHP的相关内容、Java1.5和Java1.6的新特性作了可观的扩充讲解。任何有机会使用正则表达式的读者都将因《精通正则表达式(第3版)》而受益匪浅。 《精通正则表达式(第3版)》讲解正则表达式,这种工具能够提高工作效率、让生活变得更轻松。精心调校后的正则表达式只需要十多秒就能完成以前数小时才能完成的枯燥任务。如今,正则表达式已经成为众多语言及工具--Perl、PHP、Java、Python、Ruby、MysQL、VB-NET和c#(以及.NETFramework的任何语言)--的标准特性,依靠它,你能以之前完全不敢设想的方式进行复杂而精巧的文本处理。十年三版,再显王者风范,近30年开发经验的智慧结晶,深入理解正则表达式,彻底修炼基本功,全球第一本全面深入讲解正则表达式的经典巨著,《程序员》杂志技术主编孟岩鼎力推荐。 专家点评:《精通正则表达式》是系统学习正则表达式的唯一最权威著作。任何时候,任何地方,只要提到正则表达式著作,人们都会提到这本书。该书质量之高,声誉之盛,使得几乎没有人企图挑战它的地位,从而在正则表达式图书领域形成了独特的"一夫当关"的局面,称其为正则表达式圣经,绝对当之无愧。 --《程序员》杂志技术主编孟岩 《精通正则表达式(第3版)》包含了对PHP及其正则表达式的讲解。这一版的更新也反映了其他语言的发展,深入讲解了Sun的java.util.regex,并特别提到了Java1.4.2和Java1.5/1.6之间的众多差异。 本书的内容: ·各种语言和工具的功能比较 ·正则引擎的工作原理 ·优化(能节省大量的时间) ·准确匹配期望的文本 ·针对具体语言的章节 《精通正则表达式(第3版)》,以明晰轻松的笔调向程序员深入浅出地讲解复杂的知识,并给出了现实世界复杂问题的解决办法,读者能够立刻运用书丰富的知识,巧妙而高效地解决各种问题

110,539

社区成员

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

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

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