求教一个正则表达式匹配

码农天天向上 2010-04-09 03:55:29
我需要匹配文本中的所有<a href="xxxx.htm" title="xxxxx"> 并提取放到TextBox中。
我尝试了:
Dim pattern As String = "<a href=" & "*.htm title=" & "*>"
结果不行。

我的代码是:
Dim tr As TextReader

If txtDeHTMLPath.Text = "" Then
MsgBox("Please input html path.", MsgBoxStyle.Information, "Information")
Return
End If

tr = File.OpenText(txtDeHTMLPath.Text)

Dim test As String = tr.ReadToEnd()

Dim mx As Match


Dim pattern As String = "<a href=" & "*.htm title=" & "*>"
'Dim pattern As String = "<a href="
'MsgBox(pattern)
'Return
Dim i As Integer = 1
For Each mx In Regex.Matches(test, pattern, RegexOptions.Multiline + RegexOptions.Compiled)
MsgBox(mx.Groups(i).Value)
TextBox1.AppendText(mx.Groups(i).Value)

TextBox1.AppendText(vbCrLf)
i = i + 1

Next


请高手指教,谢谢!
...全文
175 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
码农天天向上 2010-04-13
  • 打赏
  • 举报
回复
真的非常感谢~~

已结贴:)

兔子-顾问 2010-04-10
  • 打赏
  • 举报
回复
另外你可以用这个工具来看,能分析出你正则具体每一项表示什么意思。强烈推荐
正则表达式工具 Match Tracer(v2.0)
兔子-顾问 2010-04-10
  • 打赏
  • 举报
回复
那用这个正则:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim yourStr As String = "<a href=""aaaa.htm"" title=""testaaaa"">aaaaa text</a>" + vbCrLf + "<a href=""bbbb.htm"" title=""testbbbb"">bbbbb text</a>"
Dim mc As MatchCollection = Regex.Matches(yourStr, "(?is)<a href=(""?)(?<url>[^"" ]+)\1 +title=(""?)(?<title>[^""]+)\2[^>]*>(?<text>[^<>]+)</a>")
For Each m As Match In mc
MessageBox.Show("url = " & m.Groups("url").Value)
MessageBox.Show("title = " & m.Groups("title").Value)
MessageBox.Show("text = " & m.Groups("text").Value)
Next
End Sub
码农天天向上 2010-04-10
  • 打赏
  • 举报
回复
这样也不行:"<a href=(""?)(?<url>[^"" ]+)\1 +title=(""?)(?<title>[^""]+)\2 +(>?)(?<heretext>[^<]+)\3"
晕了
码农天天向上 2010-04-10
  • 打赏
  • 举报
回复
嗯,我还有最后个问题哈:
我的输入是:<a href="ch98xc09.htm" title="测试 server 服务器">测试 server 服务器</a>
我还想匹配最后的那个“测试 server 服务器”,我修改为:
"<a href=(""?)(?<url>[^"" ]+)\1 +title=(""?)(?<title>[^""]+)\2 +>(?<heretext>[^<]+)/3"
为什么却不行呢?
非常感谢哈!
兔子-顾问 2010-04-10
  • 打赏
  • 举报
回复
url中不允许有空格,引号,所以如果遇到空格,引号,就说明url结束了。
码农天天向上 2010-04-10
  • 打赏
  • 举报
回复
哦,上面的问题我明白了,你使用(?<url>[^"" ]+)是为了不匹配下一个双引号,对吗?
换句话说,意思就是匹配到直到有下一个双引号,对吗?
但是为什么要加个空格呢?
码农天天向上 2010-04-10
  • 打赏
  • 举报
回复
嗯,不好意思,我又有个问题没看懂:
pattern:"<a href=(""?)(?<url>[^"" ]+)\1 +title=(""?)(?<title>[^""]+)\2")的(?<url>[^"" ]+)是什么意思呢?为什么这次问号可以放在前面呢? 还有,对于href=后面的第一个双引号你已经使用了(""?),为什么你还要对接下来的字符串使用[^"" ]+呢?
麻烦了~~~ 我在看http://www.regexlab.com/zh/regref.htm,有些东西慢慢明白却越来越多问题了o(╯□╰)o
码农天天向上 2010-04-10
  • 打赏
  • 举报
回复
呀!我理解错了!我老是忘记"需要被转义!所以我以为(""?)是0个或者1个空白,但是想空白的话应该是" ",所以没搞懂。多谢哈!
兔子-顾问 2010-04-10
  • 打赏
  • 举报
回复
(""?)表示
0个或1个",并对结果分组
(?"")会编译不通过的
码农天天向上 2010-04-10
  • 打赏
  • 举报
回复
嗯,是字符编码我没有设置,谢谢哈!

另外,我想请问
(""?)与(?"")有什么区别吗?


兔子-顾问 2010-04-10
  • 打赏
  • 举报
回复
直接输出test试试,估计也是乱码。字符编码集问题。
码农天天向上 2010-04-10
  • 打赏
  • 举报
回复
嗯。谢谢。
但是我发现m.Groups("title").Value中的中文显示是乱码。
我的代码是:
For Each mx In Regex.Matches(test, "<a href=(""?)(?<url>[^"" ]+)\1 +title=(""?)(?<title>[^""]+)\2")
TextBox1.AppendText("url = " & mx.Groups("url").ToString)
TextBox1.AppendText("title = " & mx.Groups("title").ToString)
TextBox1.AppendText("测试")
Next

输出为:
url = ch05s09.htmtitle = ��ԭ NetBackup ���ʷ�����

我搜了下没找到咋回事。请帮忙看下哈,谢谢!
兔子-顾问 2010-04-09
  • 打赏
  • 举报
回复

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim yourStr As String = "<a href=""aaaa.htm"" title=""testaaaa"">aaaaa text</a>" + vbCrLf + "<a href=""bbbb.htm"" title=""testbbbb"">bbbbb text</a>"
Dim mc As MatchCollection = Regex.Matches(yourStr, "<a href=(""?)(?<url>[^"" ]+)\1 +title=(""?)(?<title>[^""]+)\2")
For Each m As Match In mc
MessageBox.Show("url = " & m.Groups("url").Value)
MessageBox.Show("title = " & m.Groups("title").Value)
Next
End Sub
兔子-顾问 2010-04-09
  • 打赏
  • 举报
回复
那稍微修改一下。不是中文的问题,是因为你的title中有空格,例子里没有。稍微修改一下:
"<a href=(""?)(?<url>[^"" ]+)\1 +title=(""?)(?<title>[^""]+)\2"
码农天天向上 2010-04-09
  • 打赏
  • 举报
回复
嗯,我的输入是这样的:
<a href="ch98xc09.htm" title="测试 server 服务器">
发现用你那个匹配不了:(
谢了。
兔子-顾问 2010-04-09
  • 打赏
  • 举报
回复
我给你的例子能匹配中文。
码农天天向上 2010-04-09
  • 打赏
  • 举报
回复
想再请问下,如果title的值是中文怎么办呢?
我搜索到[\u4e00-\u9fa5] 是匹配中文,
然后我尝试了这样:
Regex.Matches(test, "<a href=(""?)(?<url>[^"" ]+)\1 +title=(""?)(?<title>[^"" ][\u4e00-\u9fa5]+)\2")
结果还是不行。
码农天天向上 2010-04-09
  • 打赏
  • 举报
回复
(⊙_⊙),我是菜鸟
兔子-顾问 2010-04-09
  • 打赏
  • 举报
回复
你写的不叫正则,你写的是dos/unix下的通配符……
加载更多回复(1)

16,722

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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