商务服务
学习笔记正责表达式
2024-11-04 10:52


学习笔记都不是原创造的撒~~来自ASP.NET知识库之四 
. belvisb (将elvis视为一整体的字查找,如elvis、Elvis乎略字符大小写时)
“b”在RE中有特别的意思,在上述的例子中所指的就是字的边界,所以belvisb用b把elvis的前后边界界定出来,也就是要elvis这个字
假设要将同一行里elvis后接有alive的文字符串找出来,此时就会用到另外二个特别意义的字符”.”及”*”。”.”所代表就是除了换行字符的任意字符,而”*”所代表的是重复*之前项目直到找到符合RE的字符串。所以”.*”所指的就是除了换行字符外的任意数目的字符数。所以查找同一行里elvis后接有alive的文字符串找出来,则可下如3之RE。

学习笔记正责表达式

3. belvisb.*baliveb (查找elvis后面接有alive的文字符串,如elvis is alive)

4. bddd-dddd (查找七位数字之电话号码,如123-1234)

5. bd{3}-d{4} (查找七位数字电话号码较好的方法,如123-1234)
在d后的{3},代表重复前一个项目三次,也就是相等于ddd。

有些字符有特别的意义,比如之前所看到的”b”、”.”、”*”、”d”等。”s”所代表的是任意空格符,比如说spaces、tabs、newlines等.。”w”代表是任意字母或数字字符。


6. baw*b (查找a开头的字,如able)
这RE描述要查找一个字的开始边界(b),再来是字母”a”,再加任意数目的字母数字(w*),再接结束这个字的结束边界(b)。
7. d+ (查找数字字符串)
“+”和”*”非常相似,除了+至少要重复前面的项目一次。也就是说至少有一个数字。

8. bw{6}b (查找六个字母数字的字,如ab123c)
下表为RE常用的特殊字符

. 除了换行字符的任意字符
w 任意字母数字字符
s 任意空格符
d 任意数字字符
b 界定字的边界
^ 文章的开头,如”^The'' 用以表示出现于文章开头的字符串为”The”
$ 文章的结尾,如”End$”用以表示出现在文章的结尾为”End”

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. bw{5,6}b (查找五个或六个字母数字字符的字,如as25d、d58sdf等)

11. bd{3}sd{3}-d{4} (查找十个数字的电话号码,如800 123-1234)

12. d{3}-d{2}-d{4} (查找社会保险号码,如 123-45-6789)
13. ^w* (每行或整篇文章的第一个字)
在Espresso可试试有Multiline和没Multiline的不同。
14
匹配某范围的字符
有时需要查找某些特定的字符时怎么辨?这时中括号”[]”就派上了用场。因此[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. bd{5}-d{4}b|bd{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]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?) (寻找网络地址)
有没有发觉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+)bs*1b (寻找重复字,此处说的重复是指同样的字,中间有空白隔开如dog dog这样的字)
(w+)会抓取至少一个字符的字母或数字的字,并将它命名为群组1,之后是查找任意空格符,再接和群组1相同的文字。

如果不喜欢群组自动命名的1,也可以自行命名,以上述例子为例,(w+)改写为(?<Word>w+),这就是将所抓取的群组命名为Word,Backreference就要改写成为k<Word>

21. b(?<Word>w+)bs*k<Word>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. bw+(?=ingb) (字尾为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. bw*q[^u]w*b (一个字,其字母里有q但接下来的字母不是u)
这样的RE会有一个问题,因为[^u]要对应一个字符,所以若q是字的最后一个字母,[^u]这样的下法就会将空格符对应下去,结果就有可能会符合二个字,比如说”Iraq haha”这样的文字。使用Negative Lookaround就能解决这样的问题。

27. bw*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次,最少重复次数为原则

    以上就是本篇文章【学习笔记正责表达式】的全部内容了,欢迎阅览 ! 文章地址:http://keair.bhha.com.cn/news/164.html 
     文章      相关文章      动态      同类文章      热门文章      栏目首页      网站地图      返回首页 康宝晨移动站 http://keair.bhha.com.cn/mobile/ , 查看更多   
最新文章
入境游订单同比增长123%!福州旅游市场迎“五一”预订高峰
“五一”假期临近,福州旅游市场迎来预订高峰。据携程数据显示,截至4月16日,“五一”假期福州酒店订单量同比去年增长12%,机
给近三年最好的10部刑侦剧排个名:《乌云之上》第8,《狂飙》第3
今年开年以来,国产剧算是和刑侦类型“杠”上了。刑侦剧一部接一部,几乎没有空窗期。要么是还原了曾经的真实悬案,要么是剧情高
北京11个上市基础设施公募REITs项目募集235亿元
  中新网北京4月1日电 (记者 吕少威)记者今天从北京市发改委获悉,北京市积极推进基础设施公募REITs工作,目前累计共有11个基
ipad怎么看运行内存苹果手机怎么看内存「ipad怎么看运行内存」
iPad查看运行内存教程在iPad上查看运行内存可以帮助你了解当前设备的使用情况,以及是否需要关闭一些应用程序以释放内存。以下是
兰州华为荣耀手机维修_华为手机维修西站店手机维修店「兰州华为荣耀手机维修_华为手机维修西站店」
搭载天玑1000+旗舰芯片,采用10亿色视网膜级超感屏,配备旗舰级5000万高清主摄等,诚意满满。今天我们小九主要来跟大家说说荣耀V40
十堰空调维修|十堰空调加氟|十堰空调维修电话0719-7017199
十堰空调维修中心【电话0719-7017199】主营:十堰空调维修,十堰空调加氟,服务好价格低,各区均有分点,专业十堰空调维修加氟人员随叫随到,欢迎咨询报修。
这群青年真提气!专注自己的事 就能干成事
  这群青年真提气!  4月15日,全球首个地月空间大尺度三星星座建成的消息公布。让人心头一热的,不只是117万公里星间链路打
斗破苍穹中丹塔未来三巨头会是谁?曹颖有望占据一席,宋清可捡漏
在斗破苍穹中,与魂殿齐名的丹塔,在斗气大陆上拥有非常高的地位,被所有炼药师视为圣地,有着无与伦比的号召力。丹塔外部的三位
手机的RAM和ROM分别指什么手机rom「手机的RAM和ROM分别指什么」
关于眼光和格局的诗句有:1、莫愁前路无知己,天下谁人不识君——唐代高适《别董大二首·其一》译文:不要担心前路茫茫没有知己
太阳能电磁阀嗡嗡响,太阳能上水时电磁阀一声巨响冒烟是怎么回事手机一直震动不停怎么回事「太阳能电磁阀嗡嗡响,太阳能上水时电磁阀一声巨响冒烟是怎么回事」
冒烟就很有可能是哪部分的短路烧坏了。可能是绝缘线也有可能是电磁阀的漆包线你说呢...为什么不要呢,太阳能真是太方便了。找到
相关文章