求助VB 正则表达式问题 超出我理解范围的一个奇怪问题 (本人已解决) 使用正则的大家注意了 我有新发现!!
时间:2011-12-05
来源:互联网
遇到了一个超出了我理解范围的问题
编写的一个函数 处理HTML代码(从其中提取数据)
Dim Regex As RegExp
Dim matches As MatchCollection
Set Regex = New RegExp
With Regex
.Global = True
.IgnoreCase = True
End With
表达式如下
Ptrn = "<td valign=""top"">职称</td>(?:\r)\s*?<td valign=""top"">(\S*)(?: (\S*))?</td>"
Regex.Pattern = Ptrn
问题描述:
我用一个string变量htmlstr 存储HTML代码
如下方式匹配,则匹配数为0
Set matches = Regex.Execute(htmlstr)
但是如下匹配,则为正常该有的匹配数
html.text=htmlstr
htmlstr=html.text
Set matches = Regex.Execute(htmlstr)
或者这样也可以
Set matches = Regex.Execute(html.text)
就是说 直接操纵HTML字符串 则匹配失败
而如果将HTML代码先赋值给文本框 然后直接或间接操作文本框中的HTML代码 则成功 为什么 ??
还有我的过程中,下面还有多个使用正则表达式的地方
其他的地方都可以直接操纵HTML代码(没有经过文本框转换) 唯独第一个不可以 这个又是为什么
觉得好奇怪呀
难道问题出在(?:\r)Ptrn = "<td valign=""top"">职称</td>(?:\r)\s*?<td valign=""top"">(\S*)(?: (\S*))?</td>"
我想还是换行的地方有问题
换成这个可以了
Ptrn = "<td valign=""top"">职 称:</td>\s*<td valign=""top"">(.*?)(?: (.*?))?</td>
好奇怪呀
在vb中 . 好像不包含 换行符\r \n 的 怎么这会又包含了
还有\s包含\r \n 这会又不包含了 就是怎么回事
Ptrn = "<td valign=""top"">职 称:</td>\s*<td valign=""top"">\s*(\S*)(?: (\S*))
问题解决了 是我少写一个换行符
同时发现 当文本赋值给文本框控件时 文本框控件会“吃到” 原文中的回车 估计是将\r 换成了\n 没有测试 估计的
编写的一个函数 处理HTML代码(从其中提取数据)
Dim Regex As RegExp
Dim matches As MatchCollection
Set Regex = New RegExp
With Regex
.Global = True
.IgnoreCase = True
End With
表达式如下
Ptrn = "<td valign=""top"">职称</td>(?:\r)\s*?<td valign=""top"">(\S*)(?: (\S*))?</td>"
Regex.Pattern = Ptrn
问题描述:
我用一个string变量htmlstr 存储HTML代码
如下方式匹配,则匹配数为0
Set matches = Regex.Execute(htmlstr)
但是如下匹配,则为正常该有的匹配数
html.text=htmlstr
htmlstr=html.text
Set matches = Regex.Execute(htmlstr)
或者这样也可以
Set matches = Regex.Execute(html.text)
就是说 直接操纵HTML字符串 则匹配失败
而如果将HTML代码先赋值给文本框 然后直接或间接操作文本框中的HTML代码 则成功 为什么 ??
还有我的过程中,下面还有多个使用正则表达式的地方
其他的地方都可以直接操纵HTML代码(没有经过文本框转换) 唯独第一个不可以 这个又是为什么
觉得好奇怪呀
难道问题出在(?:\r)Ptrn = "<td valign=""top"">职称</td>(?:\r)\s*?<td valign=""top"">(\S*)(?: (\S*))?</td>"
我想还是换行的地方有问题
换成这个可以了
Ptrn = "<td valign=""top"">职 称:</td>\s*<td valign=""top"">(.*?)(?: (.*?))?</td>
好奇怪呀
在vb中 . 好像不包含 换行符\r \n 的 怎么这会又包含了
还有\s包含\r \n 这会又不包含了 就是怎么回事
Ptrn = "<td valign=""top"">职 称:</td>\s*<td valign=""top"">\s*(\S*)(?: (\S*))
问题解决了 是我少写一个换行符
同时发现 当文本赋值给文本框控件时 文本框控件会“吃到” 原文中的回车 估计是将\r 换成了\n 没有测试 估计的
作者: totola147 发布时间: 2011-12-05
这是正则表达式的表示方式,这与vb没有关系,因为你是引用了正则表达式库。
作者: chinaboyzyq 发布时间: 2011-12-05
引用 1 楼 chinaboyzyq 的回复:
这是正则表达式的表示方式,这与vb没有关系,因为你是引用了正则表达式库。
这是正则表达式的表示方式,这与vb没有关系,因为你是引用了正则表达式库。
问题已解决 注意标题及正文最后三行
作者: totola147 发布时间: 2011-12-05
十有八九是回车换行处的问题了。有些网页你右击查看源代码会发现有很多黑方块。这个就是因为在unix格式下和windows下的回车换行符不同导致的。设置到textbox中,可能被自动转换了。
如果真想探个究竟,就把html代码直接读取过来写入一个文件,将数据设置到文本框,然后将text1.text的内容直接写入另外一个文件,然后用文本比较工具,看看,肯定是每行的最后出问题的。
Ptrn = "<td valign=""top"">职称</td>(?:\r)\s*?<td valign=""top"">(\S*)(?: (\S*))?</td>" 可以改为:
Ptrn = "<td valign=""top"">职称</td>(?:\r\n)\s*?<td valign=""top"">(\S*)(?: (\S*))?</td>" 或
Ptrn = "<td valign=""top"">职称</td>[\s\S]*?<td valign=""top"">(\S*)(?: (\S*))?</td>"
如果真想探个究竟,就把html代码直接读取过来写入一个文件,将数据设置到文本框,然后将text1.text的内容直接写入另外一个文件,然后用文本比较工具,看看,肯定是每行的最后出问题的。
Ptrn = "<td valign=""top"">职称</td>(?:\r)\s*?<td valign=""top"">(\S*)(?: (\S*))?</td>" 可以改为:
Ptrn = "<td valign=""top"">职称</td>(?:\r\n)\s*?<td valign=""top"">(\S*)(?: (\S*))?</td>" 或
Ptrn = "<td valign=""top"">职称</td>[\s\S]*?<td valign=""top"">(\S*)(?: (\S*))?</td>"
作者: sysdzw 发布时间: 2011-12-05
引用 2 楼 totola147 的回复:
引用 1 楼 chinaboyzyq 的回复:
这是正则表达式的表示方式,这与vb没有关系,因为你是引用了正则表达式库。
问题已解决 注意标题及正文最后三行
看到了,是你正则写错了,人家本来是asc码两个字符1310(回车换行)你就写个10,当然匹配不了了,所以正则完全是无辜的。 引用 1 楼 chinaboyzyq 的回复:
这是正则表达式的表示方式,这与vb没有关系,因为你是引用了正则表达式库。
问题已解决 注意标题及正文最后三行
作者: sysdzw 发布时间: 2011-12-05
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28