本文实例讲述了正则表达式教程之匹配一组字符的方法。分享给大家供大家参考,具体如下:
注:在所有例子中正则表达式匹配结果包含在源文本中的【和】之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明。所有java例子都在JDK1.6.0_13下测试通过。
一、匹配多个字符中的某一个
在上一篇《正则表达式教程之匹配单个字符详解》中的一个匹配以na或sa开头的文本文件例子中,使用的正则表达式是.a.\.txt。如果还有一个文件是cal.txt,那么也将会被匹配到。如果只想要匹配na或sa开头的文件,该怎么办呢?
既然只想找出n或s,使用可以匹配任何字符的.显然是不行的。在正则表达式中,我们可以使用[和]来定义一个字符集合,在使用[和]来定义的字符集合里,这两个元字符之间的所有字符都是该集合的组成部分,字符集合的匹配结果是能够与该集合里的任何一个成员相匹配的的文本。
来看一个和上一篇相似一个例子:
文本:
sales.txt
na1.txt
na2.txt
sa1.txt
sanatxt.txt
cal.txt
正则表达式:[ns]a.\.txt
结果:
sales.txt
【na1.txt】
【na2.txt】
【sa1.txt】
sanatxt.txt
cal.txt
分析:这里使用的正则表达式是以[na]开头,这个集合将匹配字符n或s,不会匹配其他任何字符。[和]不匹配任何字符,它们只负责定义一个字符集合。接下来a匹配一个字符a,\.将匹配一个.字符本身,txt匹配txt字符本身,匹配结果与我们预期的一致。
但是,如果文件中如果有一个文件是usa1.txt,那么它也会被匹配出来。这是位置匹配的问题,在后面将会讨论到。
二、使用字符集合区间
上面的例子中,如果我们只想匹配以na或sa开头,后面跟一个数字的文件怎么办?正则表达式[ns]a.\.txt中,.将会匹配到任意一个字符,包括数字。这个问题可以使用字符集合来解决:
sales.txt
na1.txt
na2.txt
sa1.txt
san.txt
sanatxt.txt
cal.txt
正则表达式:[ns]a[0123456789]\.txt
结果:
sales.txt
【na1.txt】
【na2.txt】
【sa1.txt】
san.txt
sanatxt.txt
cal.txt
分析:从结果可以看到,我们只匹配出来以na或sa开头,后面跟一个数字的文件,而san.txt没有被匹配出来,因为使用了字符集合[0123456789]来限定第三个字符只能是数字。
在正则表达式中,会很频繁的使用到一些字符区间,比如0-9,a-z等等,为了简化字符区间的定义,正则表达式提供了一个特殊的元字符-来定义字符区间。像上面这个例子,我们可以使用正则表达式来匹配:[ns]a[0-9]\.txt,结果与上面完全一样。
字符区间不仅限于数字,像下面这些都是合法的字符区间:
[A-F]:匹配从A到F的所有大写字母。
[A-Z]:匹配从A到Z的所有大写字母。
[A-z]:匹配从ASCII字符A到ASCII字符z的所有字母。但这个区间一般不会用到,只是举例说明。因为它们之间还包含着[和^等在ASCII中排列在Z和a之间的字符。
字符区间的首尾字符可以是ASCII字符列表中的任意字符。但在实际使用中,最常用的还是数字和字母字符区间。
注意:在定义字符区间的时候,不能让区间的尾字符小于首字符(如[9-0]),这是不允许的。-作为元字符只能出现在[和]之间,如果在[和]之外的任何地方,它只是一个普通的字符,只会与-本身匹配。
在同一个字符集合中可以给出多个字符区间,比如:[0-9a-zA-Z]将匹配任意一个大小写字母和数字。
来看一下匹配网页中颜色的例子:
文本:
<span style="background-color:#3636FF;height:30px; width:60px;">测试</span>
正则表达式:#[0-9A-Fa-f] [0-9A-Fa-f] [0-9A-Fa-f] [0-9A-Fa-f] [0-9A-Fa-f] [0-9A-Fa-f]
结果:<span style="background-color:【#3636FF】;height:30px; width:60px;">测试</span>
分析:在网页中,颜色一般表示为一个以#开头的RGB值,R代表红色,G代表绿色,B代表蓝色,任何一种颜色都可以通过RGB的不同组合调和出来。RGB值用16进值表示,如#000000代表白色,#FFFFFF代表黑色,#FF0000代表红色。所以网页中匹配颜色的正则表达式是以#开头,后面跟6个相同的[0-9A-Fa-f]字符集合(这可以简写成#[0-9A-Fa-f]{6},会在后面的重复匹配中讨论到)。
三、取非匹配
字符集合通常用来指定一组必须匹配其中之一的字符,但在某些场合,我们需要反过来做,给出一组不需要得到的字符,换句话说,除了在那个字符集合中的字符,其他的任意字符都可以匹配。
比如,要匹配以na或sa开头,后面跟的不是数字的文件:
文本:
sales.txt
na1.txt
na2.txt
sa1.txt
sanatxt.txt
san.txt
正则表达式:[ns]a[^0-9]\.txt
结果:
sales.txt
na1.txt
na2.txt
sa1.txt
sanatxt.txt
【san.txt】
分析:这个例子使用的模式正好与前面的相反,前面[0-9]只匹配数字,而这里[^0-9]匹配的是非数字。
注意:^在[和]之间表示取非,如果出现在正则表达式的开头,表示位置匹配匹配了,这将在后面讨论到。同时,^的效果将作用于给定字符集合里的所有字符或字符区间,而不仅限于紧跟在^字符后面的那一个字符或字符区间。如[^0-9a-z]表示不匹配任何数字或小写字母。
四、小结
元字符[和]用于定义一个字符集合,其含义是必须与该集合里的字符之一匹配。定义一个字符集合的方法有两种:一是把所有的字符都列举出来;二是利用元字符-以字符区间的方式给出。字符集合可以使用元字符^来取非,这将把给定的字符集合强行排除在匹配操作外,除了该字符集合里的字符,其他字符都可以匹配。
在接下来的文章中,我们将会讨论正则表达式中的一些元字符的使用。
PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:
JavaScript正则表达式在线测试工具:
http://tools.jb51.net/regex/javascript
正则表达式在线生成工具:
http://tools.jb51.net/regex/create_reg
希望本文所述对大家正则表达式学习有所帮助。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]