15年来,为全国50万+企业提供互联网数字化基础应用服务。
微网小程序
电商运营
关于我们
付款方式
荣誉资质
业务提交
代理合作
知 识
400-1100-266
9:00-24:00(工作日)
首 页
企业400电话
Hot
网站建设
商标✡知产
网络优化推广
热
AI电话机器人
呼叫中心
彩铃•短信
增值拓展业务
新
主页
>
知识库
> 正则表达式高级学习技巧
正则表达式高级学习技巧
热门标签:
银行业务
科大讯飞语音识别系统
服务器配置
Linux服务器
电子围栏
团购网站
阿里云
Mysql连接数设置
什么是RE?
想必各位大大在做文件查找的时侯都有使用过万用字符”*”,比如说想查找在Windows目录下所有的Word文件时,你可能就会用”*.doc”这样的方式来做查找,因为”*”所代表的是任意的字符。RE所做的就是类似这样的功能,但其功能更为强大。
写程序时,常需要比对字符串是否符合特定样式,RE最主要的功能就是来描述这特定的样式,因此可以将RE视为特定样式的描述式,举个例子来说,”\w+”所代表的就是任何字母与数字所组成的非空字符串(non-null string)。在.NET framework中提供了非常强大的类别库,藉此可以很轻易的使用RE来做文字的查找与取代、对复杂标头的译码及验证文字等工作。
接下来,就让我们来体验一些例子吧。
一些简单的例子
假设要查找文章中Elvis后接有alive的文字符串的话,使用RE可能会经过下列的过程,括号是所下RE的意思:
1. elvis (查找elvis)
上述代表所要查找的字符顺序为elvis。在.NET中可以设定乎略字符的大小写,所以”Elvis”、”ELVIS”或者是”eLvIs”都是符合1所下的RE。但因为这只管字符出现的顺序为elvis,所以pelvis也是符合1所下的RE。可以用2的RE来改进。
2. \belvis\b (将elvis视为一整体的字查找,如elvis、Elvis乎略字符大小写时)
“\b”在RE中有特别的意思,在上述的例子中所指的就是字的边界,所以\belvis\b用\b把elvis的前后边界界定出来,也就是要elvis这个字。
假设要将同一行里elvis后接有alive的文字符串找出来,此时就会用到另外二个特别意义的字符”.”及”*”。”.”所代表就是除了换行字符的任意字符,而”*”所代表的是重复*之前项目直到找到符合RE的字符串。所以”.*”所指的就是除了换行字符外的任意数目的字符数。所以查找同一行里elvis后接有alive的文字符串找出来,则可下如3之RE。
3. \belvis\b.*\balive\b (查找elvis后面接有alive的文字符串,如elvis is alive)
用简单之特别字符就可以组成功能强大的RE,但也发现当使用越来越多的特别字符时,RE就会越来越难看得懂了。
再看看另外的例子
组成有效的电话号码
假使要从网页上收集顾客格式为xxx-xxxx的7位数字的电话号码,其中x是数字,RE可能会这样写。
4. \b\d\d\d-\d\d\d\d (查找七位数字之电话号码,如123-1234)
每一个\d代表一个数字。”-”则是一般的连字符号,为避免太多重复的\d,RE可以改写成如5的方式。
5. \b\d{3}-\d{4} (查找七位数字电话号码较好的方法,如123-1234)
在\d后的{3},代表重复前一个项目三次,也就是相等于\d\d\d。
RE的学习及测试工具 Expresso
因为RE不易阅读及使用者容易会下错RE的特性,Jim大大开发了一个工具软件Expresso,用来帮助使用者学习及测试RE,除了上面所述的网址之外,也可以上Ultrapico网站。安装完expresso后,在expression%20%20library中,jim大大把文章的例子都建立在其中,可以边看文章边测试,也可以试着修改范例所下的re,马上可以看到结果,小弟觉得非常好用。各位大大可以试试。/"。安装完Expresso后,在Expression Library中,Jim大大把文章的例子都建立在其中,可以边看文章边测试,也可以试着修改范例所下的RE,马上可以看到结果,小弟觉得非常好用。各位大大可以试试。
.NET中RE的基础概念
特殊字符
有些字符有特别的意义,比如之前所看到的”\b”、”.”、”*”、”\d”等。”\s”所代表的是任意空格符,比如说spaces、tabs、newlines等.。”\w”代表是任意字母或数字字符。
再看一些例子吧
6. \ba\w*\b (查找a开头的字,如able)
这RE描述要查找一个字的开始边界(\b),再来是字母”a”,再加任意数目的字母数字(\w*),再接结束这个字的结束边界(\b)。
7. \d+ (查找数字字符串)
“+”和”*”非常相似,除了+至少要重复前面的项目一次。也就是说至少有一个数字。
8. \b\w{6}\b (查找六个字母数字的字,如ab123c)
下表为RE常用的特殊字符
. 除了换行字符的任意字符
\w 任意字母数字字符
\s 任意空格符
\d 任意数字字符
\b 界定字的边界
^ 文章的开头,如”^The'' 用以表示出现于文章开头的字符串为”The”
$ 文章的结尾,如”End$”用以表示出现在文章的结尾为”End”
特殊字符”^”及”$”是用来查找某些字必需是文章的开头或结尾,这在验证输入是否符合某一样式时特别用有,比如说要验证七位数字的电话号码,可能会输入如下9的RE。
9. ^\d{3}-\d{4}$ (验证七位数字之电话号码)
这和第5个RE相同,但其前后都无其它的字符,也就是整串字符串只有这七个数字的电话号码。在.NET中如果设定Multiline这个选项,则”^”和”$”会每行进行比较,只要某行的开头结尾符合RE即可,而不是整个文章字符串做一次比较。
转意字符(Escaped characters)
有时可能会需要”^”、”$”单纯的字面意义(literal meaning)而不要将它们当成特殊字符,此时”\”字符就是用来移除特殊字符特别意义的字符,因此”\^”、”\.”、”\\”所代表的就是”^”、”.”、”\”的字面意义。
重复前述项目
在前面看过”{3}”及”*”可以用来重复前述字符,之后我们会看到如何用同样的语法重复整个次描述(subexpressions)。下表是使用重复前述项目的一些方式。
* 重复任意次数
+ 重复至少一次
? 重复零次或一次
{n} 重复n次
{n,m} 重复至少n次,但不超过m次
{n,} 重复至少n次
再来试一些例子吧
10. \b\w{5,6}\b (查找五个或六个字母数字字符的字,如as25d、d58sdf等)
11. \b\d{3}\s\d{3}-\d{4} (查找十个数字的电话号码,如800 123-1234)
12. \d{3}-\d{2}-\d{4} (查找社会保险号码,如 123-45-6789)
13. ^\w* (每行或整篇文章的第一个字)
在Espresso可试试有Multiline和没Multiline的不同。
匹配某范围的字符
有时需要查找某些特定的字符时怎么辨?这时中括号”[]”就派上了用场。因此[aeiou]所要查找的是”a”、”e”、”i”、”o”、”u”这些元音,[.?!]所要查找的是”.”、”?”、”!”这些符号,在中括号中的特殊字符的特别意义都会被移除,也就是解译成单纯的字面意义。也可以指定某些范围的字符,如”[a-z0-9]”,所指的就是任意小写字母或任意数字。
接下来再看一个比较初复杂查找电话号码的RE例子
14. \(?\d{3}[( ] \s?\d{3}[- ]\d{4} (查找十位数字之电话号码,如(080) 333-1234 )
这样的RE可查找出较多种格式的电话号码,如(080) 123-4567、511 254 6654等。”\(?”代表一个或零个左小括号”(“,而”[( ]”代表查找一个右小括号”)”或空格符,”\s?”指一个或零个空格符组。但这样的RE会将类似”800) 45-3321”这样的电话找出来,也就是括号没有对称平衡的问题,之后会学到择一(alternatives)来决解这样的问题。
不包含在某特定字符组里(Negation)
有时需要查找在包含在某特定字符组里的字符,下表说明如何做类似这样的描述。
\W 不是字母数字的任意字符
\S 不是空格符的任意字符
\D 不是数字字符的任意字符
\B 不在字边界的位置
[^x] 不是x的任意字符
[^aeiou] 不是a、e、i、o、u的任意字符
15. \S+ (不包含空格符的字符串)
择一(Alternatives)
有时会需要查找几个特定的选择,此时”|”这个特殊字符就派上用场了,举例来说,要查找五个数字及九个数字(有”-”号)的邮政编码。
16. \b\d{5}-\d{4}\b|\b\d{5}\b (查找五个数字及九个数字(有”-”号)的邮政编码)
在使用Alternatives时需要注意的是前后的次序,因为RE在Alternatives中会优先选择符合最左边的项目,16中,如果把查找五个数字的项目放在前面,则这RE只会找到五个数字的邮政编码。了解了择一,可将14做更好的修正。
17. (\(\d{3}\)|\d{3})\s?\d{3}[- ]\d{4} (十个数字的电话号码)
群组(Grouping)
括号可以用来介定一个次描述,经由次描述的介定,可以针对次描述做重复或及他的处理。
18. (\d{1,3}\.){3}\d{1,3} (寻找网络地址的简单RE)
此RE的意思第一个部分(\d{1,3}\.){3},所指的是,数字最小一位最多三位,并且后面接有”.”符号,此类型的共有三个,之后再接一到三位的数字,也就是如192.72.28.1这样的数字。
但这样会有个缺点,因为网络地址数字最多只到255,但上述的RE只要是一到三位的数字都是符合的,所以这需要让比较的数字小于256才行,但只单独使用RE并无法做这样的比较。在19中使用择一来将地址的限制在所需要的范围内,也就是0到255。
19. ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) (寻找网络地址)
有没有发觉RE越来越像外星人说的话了?就以简单的寻找网络地址,直接看RE都满难理解的哩。
Expresso Analyzer View
Expresso提供了一个功能,它可以将所下的RE变成树状的说明,一组组的分开说明,提供了一个好的除错环境。其它的功能,如部分符合(Partial Match只查找反白RE的部分)及除外符合(Exclude Match只不查找反白RE的部分)就留给各位大大试试啰。
当次描述用括号群组起来时,符合次描述的文字可用在之后的程序处理或RE本身。在预设的情型下,所符合的群组是由数字命名,由1开始,由顺序是由左至右,这自动群组命名,可在Expresso中的skeleton view或result view中看到。
Backreference是用来查找群组中抓取的符合文字所相同的文字。举例来说”\1”所指符合群组1所抓取的文字。
20. \b(\w+)\b\s*\1\b (寻找重复字,此处说的重复是指同样的字,中间有空白隔开如dog dog这样的字)
(\w+)会抓取至少一个字符的字母或数字的字,并将它命名为群组1,之后是查找任意空格符,再接和群组1相同的文字。
如果不喜欢群组自动命名的1,也可以自行命名,以上述例子为例,(\w+)改写为(?Word>\w+),这就是将所抓取的群组命名为Word,Backreference就要改写成为\kWord>
21. \b(?Word>\w+)\b\s*\kWord>\b (使用自行命名群组抓取重复字)
使用括号还有许多特别的语法元素,比较通用的列表如下:
抓取(Captures)
(exp) 符合exp并抓取它进自动命名的群组
(?name>exp) 符合exp并抓取它进命名的群组name
(?:exp) 符合exp,不抓取它
Lookarounds
(?=exp) 符合字尾为exp的文字
(?=exp) 符合前缀为exp的文字
(?!exp) 符合后面没接exp字尾的文字
(?!exp) 符合前面没接exp前缀的文字
批注Comment
(?#comment) 批注
Positive Lookaround
接下来要谈的是lookahead及lookbehind assertions。它们所查找的是目前符合之前或之后的文字,并不包含目前符合本身。这些就如同”^”及”\b”特殊字符,本身并不会对应任何文字(用来界定位置),也因此称做是zero-width assertions,看些例子也许会清楚些。
(?=exp)是一个”zero-width positive lookahead assertion”。它指的就是符合字尾为exp的文字,但不包含exp本身。
22. \b\w+(?=ing\b) (字尾为ing的字,比如说filling所符合的就是fill)
(?=exp)是一个”zero-width positive lookbehind assertion”。它指的就是符合前缀为exp的文字,但不包含exp本身。
23. (?=\bre)\w+\b (前缀为re的字,比如说repeated所符合的就是peated)
24. (?=\d)\d{3}\b (在字尾的三位数字,且之前接一位数字)
25. (?=\s)\w+(?=\s) (由空格符分隔开的字母数字字符串)
Negative Lookaround
之前有提到,如何查找一个非特定或非在特定群组的字符。但如果只是要验证某字符不存在而不要对应这些字符进来呢?举个例子来说,假设要查找一个字,它的字母里有q但接下来的字母不是u,可以用下列的RE来做。
26. \b\w*q[^u]\w*\b (一个字,其字母里有q但接下来的字母不是u)
这样的RE会有一个问题,因为[^u]要对应一个字符,所以若q是字的最后一个字母,[^u]这样的下法就会将空格符对应下去,结果就有可能会符合二个字,比如说”Iraq haha”这样的文字。使用Negative Lookaround就能解决这样的问题。
27. \b\w*q(?!u)\w*\b (一个字,其字母里有q但接下来的字母不是u)
这是”zero-width negative lookahead assertion”。
28. \d{3}(?!\d) (三个位的数字,其后不接一个位数字)
同样的,可以使用(?!exp),”zero-width negative lookbehind assertion”,来符合前面没接exp前缀的文字符串。
29. (?![a-z ])\w{7} (七个字母数字的字符串,其前面没接字母或空格)
30. (?=(\w+)>.*(?=\/\1> (HTML卷标间的文字)
这使用lookahead及lookbehind assertion来取出HTML间的文字,不包括HTML卷标。
请批注(Comments Please)
括号还有个特殊的用途就是用来包住批注,语法为”(?#comment)”,若设定”Ignore Pattern Whitespace”选项,则RE中的空格符当RE使用时会乎略。此选项设定时,”#”之后的文字会乎略。
31. HTML卷标间的文字,加上批注
(?= #查找前缀,但不包含它
(\w+)> #HTML标签
) #结束查找前缀
.* #符合任何文字
(?= #查找字尾,但不包含它
\/\1> #符合所抓取群组1之字符串,也就是前面小括号的HTML标签
) #结束查找字尾
寻找最多字符的字及最少字符的字(Greedy and Lazy)
当RE下要查找一个范围的重复时(如”.*”),它通常会寻找最多字符的符合字,也就是Greedy matching。举例来说。
32. a.*b (开始为a结束为b的最多字符的符合字)
若有一字符串是”aabab”,使用上述RE所得到的符合字符串就是”aabab”,因为这是寻找最多字符的字。有时希望是符合最少字符的字也就是lazy matching。只要将重复前述项目的表加上问号(?)就可以把它们全部变成lazy matching。因此”*?”代表的就是重复任意次数,但是使用最少重复的次数来符合。举个例子来说:
33. a.*?b (开始为a结束为b的最少字符的符合字)
若有一字符串是”aabab”,使用上述RE第一个所得到的符合字符串就是”aab”再来是”ab”,因为这是寻找最少字符的字。
*? 重复任意次数,最少重复次数为原则
+? 重复至少一次,最少重复次数为原则
?? 重复零次或一次,最少重复次数为原则
{n,m}? 重复至少n次,但不超过m次,最少重复次数为原则
{n,}? 重复至少n次,最少重复次数为原则
还有什么没提到呢?
到目前为止,已经提到了许多建立RE的元素,当然还有许多元素没有提到,下表整理了一些没提到的元素,在最左边的字段的数字是说明在Expresso中的例子。
# 语法 说明
\a Bell 字符
\b 通常是指字的边界,在字符组里所代表的就是backspace
\t Tab
34 \r Carriage return
\v Vertical Tab
\f From feed
35 \n New line
\e Escape
36 \nnn ASCII八位码为nnn的字符
37 \xnn 十六位码为nn的字符
38 \unnnn Unicode为nnnn的字符
39 \cN Control N字符,举例来说Ctrl-M是\cM
40 \A 字符串的开始(和^相似,但不需籍由multiline选项)
41 \Z 字符串的结尾
\z 字符串的结尾
42 \G 目前查找的开始
43 \p{name} Unicode 字符组名称为name的字符,比如说\p{Lowercase_Letter} 所指的就是小写字
(?>exp) Greedy次描述,又称之为non-backtracking次描述。这只符合一次且不采backtracking。
44 (?x>-y>exp)
or (?-y>exp) 平衡群组。虽复杂但好用。它让已命名的抓取群组可以在堆栈中操作使用。(小弟对这个也是不太懂哩)
45 (?im-nsx:exp) 为次描述exp更改RE选项,比如(?-i:Elvis)就是把Elvis大乎略大小写的选项关掉
46 (?im-nsx) 为之后的群组更改RE选项。
(?(exp)yes|no) 次描述exp视为zero-width positive lookahead。若此时有符合,则yes次描述为下一个符合标的,若否,则no 次描述为下一个符合标的。
(?(exp)yes) 和上述相同但无no次描述
(?(name)yes|no) 若name群组为有效群组名称,则yes次描述为下一个符合标的,若否,则no 次描述为下一个符合标的。
47 (?(name)yes) 和上述相同但无no次描述
您可能感兴趣的文章:
ASP正则表达式技巧
PHP 正则表达式的几则使用技巧
正则表达式高级技巧及实例详解 笨活儿
javascript 正则表达式(二) 使用技巧说明
模板引擎正则表达式调试小技巧
正则表达式的高级技巧分享
.NET 正则表达式使用高级技巧之替换类介绍
正则表达式匹配不包含某些字符串的技巧
写出高效率的正则表达式技巧总结
标签:
萍乡
大理
江苏
衢州
枣庄
蚌埠
衡水
广元
巨人网络通讯声明:本文标题《正则表达式高级学习技巧》,本文关键词 ;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
相关文章
电销机器人到底如何运作的?
很多人对 电销 机器人到底如何运作存在着巨大的好奇心,那么今天,小编就带大家看一下机器人的运作流程! 电销...
10-24
电话机器人的兴起对电销行业来说是“惊喜”还
随着互联网 大数据 的普及,许多 电销 行业如雨后春笋般争先恐后地冒出来。而今电销行业的混乱,让各位涉足电销...
10-24
百应电话机器人有哪些功能?百应电话机器人好
百应 智能 电话机器人 能够协助企业进行呼入接待、 外呼 回访等服务场景,能够经过不断的培训学习,逐步完善成专...
10-24
客服外呼系统都有哪些优势?
当前呼叫中心电话系统被企业用于业务 电销 以及客户服务,然而随着企业需求不断扩大,原来传统的自建 呼叫中心...
10-24
电销机器人效果怎么样?智能电话机器人可行吗
几百数千年后,或许没人会记得卡斯帕罗夫曾是世界第一的围棋高手,但人们会记得,他败给了电脑深蓝。那虽算不...
10-24
百应智能外呼系统,贷后管理科技升级
去年底开始,接连出台政策和法规加强对消费 金融 等金融形态进行 规范 。强 监管 下,行业走向规范发展,行业竞...
10-24
百应智能外呼系统引领外呼行业新风向
电话销售: 您好,我这边是XX地产,给您推荐一下精装酒店式公寓,有兴趣了解一下吗? 客户: 具体位置在哪里啊?...
10-24
小贷企业为什么需要电销机器人?
随着信贷行业逐步进入我们的生活中,越来越多人选择借款来处理资金难题。信贷企业不断涌现,业务开展迅猛,行...
10-24
雷霆电话机器人是如何转接人工的?
当我们在拨通移动、联通或电信 运营商 的客服电话时,总会要先经过一些机械化的选择,然后成功连接人工坐席反馈...
10-24
米卡迪电话机器人效果怎么样?
外呼 电话机器人 ,之所以能智能的与客户无忧交流,因为运用了下面这么多高技术。 ASR 语音识别 米卡迪电话机器人...
10-24
灵声电话机器人效果怎么样?好用吗
外呼 电话机器人 ,之所以能智能的与客户无忧交流,因为运用了下面这么多高技术。 灵声 电话机器人 效果怎么样?...
10-24
电销机器人要想效果好,话术定制有多重要
电话机器人 是基于智能语音技术的智能营销工具。它会像真人一样主动拨打客户的电话,介绍产品并回答客户的咨询...
10-24
智能电话机器人的实现原理,使用安全吗?
随着科学技术的进步和 人工智能 的发展,越来越多的智能产品已经进入我们的工作和生活。智能手机、智能电视、智...
10-24
福州哪里有电话机器人研发公司?
人工智能 再次成为各行各业关注的焦点,自从这个概念首次提出以来,60年已经过去了。自从AlphaGo以巨大优势击败人...
10-24
电销机器人销售能力怎么样?
自从 电话机器人 一出现,在 电销 行业火爆了起来。面对电话机器人的各种优势,企业跃跃欲试,但又害怕效果不理...
10-24
推荐文章
加强商标权保护至关重要
MaerskData美国公司选择思科IP电话解决方案
我看CTI行业这十四年的发展(上)
您的联络中心NLP和NLU指南
Win10 Mobile预览版10536使用后越来越卡顿
优化产业结构 商务部服务外包研究中心一行来漳调研
科大讯飞“语音云”发布 移动互联网迈入语音时代
习近平叮嘱大庆加快城市转型
上一篇:
JScript中正则表达函数的说明与应用
下一篇:
用正则表达式来表示中文
一起分享吧
版权所有:巨人网络(扬州)科技有限公司——拥有网站建设十年经验,具备独立网站开发能力,能够提供完善的网站设计及相关的网站制作服务! 全国统一服务热线:400-1100-266
展开
收缩
QQ咨询
在线咨询
客服小董
客服小张
客服小刘
客服小李
客服小王
招商加盟
财务查询
微信客服
电话咨询
400-1100-266