好久不用的正则表达式
2016-04-27 13:05
211 查看
今天遇到一个抓取html手机号的需求,以前一直用的HtmlAgilityPack这个组件包,现在看来用这个有点吃力了
于是果断选择用正则表达式,用regextest测试了下发觉好似很久不用都忘的有点差不多了
<div><li class="xxx">
<font class="xx">手机号码</font>
<span class="xxxx"> 130*****602 </span>
</li></div>
通过这么一段解析这个号码130*****602,
用htmlAgilityPack 能拿到单个document节点,但是节点需要类似js里面的 getelementbyid,需要html标签上有id这个属性
这样一来又取不到了
第二种方式:
通过 var phoneText = firstHtmldoc.DocumentNode.SelectNodes("//html[1]//body[1]//span[@class='xxxx'][0]")[0].InnerText;
来截取,但是有一点那一天 这个html排版变化了这里又不管用了
so
正则上吧
号码的规则先理出来 为 数字(3个)+*符号5个+数字3个
而这里*为正则里面的表达式符号,所以用的时候一定要\转义
限定个数{3}
\d{3}\*{5}\d{3}
附正则说明
C#正则表达式符号模式
说明:
由于在正则表达式中“ \ ”、“ ? ”、“ * ”、“ ^ ”、“ $ ”、“ + ”、“(”、“)”、“ | ”、“ { ”、“ [ ”等字符已经具有一定特殊意义,如果需要用它们的原始意义,则应该对它进行转义,例如希 望在字符串中至少有一个“ \ ”,那么正则表达式应该这么写: \\+ 。
于是果断选择用正则表达式,用regextest测试了下发觉好似很久不用都忘的有点差不多了
<div><li class="xxx">
<font class="xx">手机号码</font>
<span class="xxxx"> 130*****602 </span>
</li></div>
通过这么一段解析这个号码130*****602,
用htmlAgilityPack 能拿到单个document节点,但是节点需要类似js里面的 getelementbyid,需要html标签上有id这个属性
这样一来又取不到了
第二种方式:
通过 var phoneText = firstHtmldoc.DocumentNode.SelectNodes("//html[1]//body[1]//span[@class='xxxx'][0]")[0].InnerText;
来截取,但是有一点那一天 这个html排版变化了这里又不管用了
so
正则上吧
号码的规则先理出来 为 数字(3个)+*符号5个+数字3个
而这里*为正则里面的表达式符号,所以用的时候一定要\转义
限定个数{3}
\d{3}\*{5}\d{3}
附正则说明
C#正则表达式符号模式
字 符 | 描 述 |
\ | 转义字符,将一个具有特殊功能的字符转义为一个普通字符,或反过来 |
^ | 匹配输入字符串的开始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的零次或多次的子表达式 |
+ | 匹配前面的一次或多次的子表达式 |
? | 匹配前面的零次或一次的子表达式 |
{n} | n是一个非负整数,匹配前面的n次子表达式 |
{n,} | n是一个非负整数,至少匹配前面的n次子表达式 |
{n,m} | m和n均为非负整数,其中n<=m,最少匹配n次且最多匹配m次 |
? | 当该字符紧跟在其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式尽可能少的匹配所搜索的字符串 |
. | 匹配除“\n”之外的任何单个字符 |
(pattern) | 匹配pattern并获取这一匹配 |
(?:pattern) | 匹配pattern但不获取匹配结果 |
(?=pattern) | 正向预查,在任何匹配pattern的字符串开始处匹配查找字符串 |
(?!pattern) | 负向预查,在任何不匹配pattern的字符串开始处匹配查找字符串 |
x|y | 匹配x或y。例如,‘z|food’能匹配“z”或“food”。‘(z|f)ood’则匹配“zood”或“food” |
[xyz] | 字符集合。匹配所包含的任意一个字符。例如,‘[abc]’可以匹配“plain”中的‘a’ |
[^xyz] | 负值字符集合。匹配未包含的任意字符。例如,‘[^abc]’可以匹配“plain”中的‘p’ |
[a-z] | 匹配指定范围内的任意字符。例如,‘[a-z]’可以匹配'a'到'z'范围内的任意小写字母字符 |
[^a-z] | 匹配不在指定范围内的任意字符。例如,‘[^a-z]’可以匹配不在‘a’~‘z’'内的任意字符 |
\b | 匹配一个单词边界,指单词和空格间的位置 |
\B | 匹配非单词边界 |
\d | 匹配一个数字字符,等价于[0-9] |
\D | 匹配一个非数字字符,等价于[^0-9] |
\f | 匹配一个换页符 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等 |
\S | 匹配任何非空白字符 |
\t | 匹配一个制表符 |
\v | 匹配一个垂直制表符。等价于\x0b和\cK |
\w | 匹配包括下划线的任何单词字符。等价于‘'[A-Za-z0-9_]’ |
\W | 匹配任何非单词字符。等价于‘[^A-Za-z0-9_]’ |
由于在正则表达式中“ \ ”、“ ? ”、“ * ”、“ ^ ”、“ $ ”、“ + ”、“(”、“)”、“ | ”、“ { ”、“ [ ”等字符已经具有一定特殊意义,如果需要用它们的原始意义,则应该对它进行转义,例如希 望在字符串中至少有一个“ \ ”,那么正则表达式应该这么写: \\+ 。
相关文章推荐
- 练习三1001
- 为什么科技公司会信神信教信风水?
- cvNormalizeHist()函数详解!
- Redis为什么这么快?
- Scrum团队成立及《构建之法》第六、七章读后感
- 【VS开发】C++ opencv Mat基础
- 循环中读取数据库、嵌套循环引起的性能问题
- Vmstat 2 详解
- 学习进度条
- 解决 Ubuntu 无法调节屏幕亮度的问题(转)
- 301跳转
- redis的一个操作的代码执行流程
- 精通CSS滤镜(filter)
- 如何刷新K/3 Cloud Oracle 数据库的物化视图
- 150. Evaluate Reverse Polish Notation
- 长方柱体类
- android的token
- Android ListView中 每一项都有不同的布局
- 正则表达式知识详解之贪婪模式和非贪婪模式 (java版示例)
- 如何修改数据库的快照隔离级别