正则表达式中括号的多义性

332 阅读12分钟
原文链接: www.cnblogs.com
正则表达式中括号的多义性 - snandy - 博客园

Snandy

If you cannot hear the sound of the genuine in you, you will all of your life spend your days on the ends of strings that somebody else pulls.

正则表达式中括号的多义性

中括号在正则中称为字符组(Character class),有的书翻译为字符类,还有的翻译成字符集。我觉得字符组更好点,毕竟class在计算机属于中代表面向对象里的“类”。顾名思义,字符组为一组字符,它表示在一个位置里可能出现的多种字符。注意这里强调只匹配一个位置哦。

  • 简单字符组
  • 范围字符组
  • 组合字符组
  • 排除型字符组
  • 字符组运算
  • 预定义字符组

 

一、简单字符组

示例1:[123] 可以分别匹配包含1-3这5个数的字符串。

?
1 2 3 4 5 6 7 8 var reg = /[123]/ reg.test('1') // -> true reg.test('2') // -> true reg.test('3') // -> true reg.test('4') // -> false reg.test('14') // -> true reg.test('25') // -> true reg.test('36') // -> true

  

示例2:匹配 bat、cat、fat。

?
1 2 3 4 var reg = /[bcf]at/ reg.test('bat') // -> true reg.test('cat') // -> true reg.test('fat') // -> true

 

二、范围字符组(Range class,与连字符 “-” 一起使用)

上面示例1中 [123] 可以匹配字符'1', '2', '3'。如果要匹配0-9可以写成 [0123456789],但有了范围字符组更简洁了,可以写成 /[0-9]/。

示例3:匹配数字

?
1 2 3 4 5 var reg = /[0-9]/ reg.test('0') // -> true reg.test('1') // -> true reg.test('2') // -> true ...

 

示例4:匹配HTML的标题标签

?
1 2 3 4 5 6 7 8 9 var reg = /<h[1-6]>/ reg.test('<h1>') // -> true reg.test('<h2>') // -> true reg.test('<h3>') // -> true reg.test('<h4>') // -> true reg.test('<h5>') // -> true reg.test('<h6>') // -> true reg.test('<h7>') // -> false reg.test('<div>') // -> false

  

匹配小写英文字母可以用字符组 [a-z], 匹配大写英文字母用 [A-Z]。这里最关键的是连字符 "-",不要理解为减号。 它的意义是“从什么到什么”,如[a-z]理解为从 “a” 到 “z”。

需要注意几点

1. 连字符(-)只在字符组内(中括号)才是元字符。如

?
1 2 3 4 var reg = /1-5/ reg.test('1') // -> true reg.test('2') // -> false,不是连字符,不包含2,3,4 reg.test('-') // -> true, 这里 “-” 只是一个普通字符

2. 甚至在字符组内部,它也不一定是元字符。如

?
1 2 3 4 5 var reg1 = /[-123]/ var reg2 = /[123-]/ // 在字符组首部或尾部位置,仅作为一个普通字符,而不是表示范围的连字符 reg1.test('-') // -> true reg2.test('-') // -> true

此外,很多元字符在字符组内都变成了普通字符,如(^$?)等。

3. 范围不能乱写,比如只能 [0-9],不能[9-0]。不然浏览器会报错,如下是Firebug的报错

范围字符组实际是安装字符对于的ASCII码值来确定的,值小的在前面,值大的在后面。例如[0-9]的码值为48~57,[a-z]的码值为97~122,[A-Z]的码值为65~90。

附上ASCII表

另外,可以这么写 [0-z],即表示范围ASCII 48~122,但不推荐这么写,它的意义不直白。如果不查ASCII表,很难知道它表示数字[0-9],大写字母[A-Z],小写字母[a-z]和一些特殊字符([,\,],^,_,`)。

 

三、组合字符组(Combination class)

由多种字符组组合一起的字符组

示例5:匹配a~f和1-5之间的字符 [a-f1-5]

?
1 2 3 4 5 6 7 var reg = /[a-c1-3]/ reg.test('a') // -> true reg.test('b') // -> true reg.test('c') // -> true reg.test('1') // -> true reg.test('2') // -> true reg.test('3') // -> true

需要注意的是,字符组内不要有空格,有人喜欢在f和1之间加个空格,以便阅读起来舒服一些,但这是不允许的。

 

四、排除型字符组(Negated character class,与脱字符 “^” 一起使用)

有时列出所有的字符几乎不可能,那得列多少啊,这时可以使用排除型字符组。只要在左方括号后紧跟一个脱字符^即可。排除型字符组表示:匹配一个未列出的字符(match a character that's not listed),而不是不要匹配列出的字符。

示例6:匹配非数字字符

?
1 2 3 4 var reg = /[^0-9]/ reg.test('1') // -> false reg.test('2') // -> false reg.test('a') // -> true

 

五、字符组运算(方括号嵌套+运算符)

有些语言支持,比如&&+[] Java中就支持,但JavaScript不支持。

示例7:匹配英文字母中除去元音字符的字符

?
1 [[a-z]&&[^aeiou]] // a-z 且排除掉5个元音字符aeiou

  

六、预定义字符组(又称字符组简记)

比如JavaScript中提供了 \d, \w, \s 表示数字字符组(digit),单词字符组(word),和空白符字符组(space)。另外还有对于的排除型字符组简写 \D,\W,\S 分别对于非数字字符组,非单词字符组,非空白字符组。

?
1 2 3 \d == [0-9] \w == [a-zA-Z_0-9] \s == [ \t\n\x0B\f\r]

 

posted on 2014-04-14 08:01 snandy 阅读(13199) 评论(4) 编辑 收藏

评论

#1楼 2014-04-14 13:51 codezyc  

谢谢楼主的分享。 支持(0)反对(0)   

#2楼 2014-04-18 20:26 jiangjunzhang  

虽然现在用不到,不过mark了 支持(0)反对(0)   

#3楼 2016-08-23 17:16 maplecumt  

有的书翻译为字符类,还有的翻译成字符集。我觉得字符组更好点,毕竟class在计算机属于中代表面向对象里的“类”。


不应该是
我觉得字符类更好点,毕竟class在计算机属于中代表面向对象里的“类”。 支持(0)反对(0) http://pic.cnblogs.com/face/u363137.jpg?id=07103501   

#4楼36993412017/5/24 8:35:55 2017-05-24 08:35 Avenstar  

@snandy 这个全匹配的时候才为true
支持(0)反对(0)http://pic.cnblogs.com/face/819169/20171029125922.png    刷新评论刷新页面返回顶部 注册用户登录后才能发表评论,请 登录注册访问网站首页。 【推荐】50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
【推荐】腾讯云免费实验室,1小时搭建人工智能应用
【新闻】H3 BPM体验平台全面上线
葡萄城AR1114 最新IT新闻:
· AOL创始人成立新基金 获贝索斯和施密特等人1.5亿美元投资
· 安卓Go系统交付硬件厂商 专为512M或1G内存手机设计
· 怒赞!上海人率先体验支付宝刷脸坐地铁 语音购票
· 苹果刚刚宣布2011 Mac迷你电脑为“淘汰产品”
· 还买什么比特币,快来以太坊里“链养猫”!
» 更多新闻... 阿里云1113 最新知识库文章:
· 以操作系统的角度述说线程与进程
· 软件测试转型之路
· 门内门外看招聘
· 大道至简,职场上做人做事做管理
· 关于编程,你的练习是不是有效的?
» 更多知识库文章...

导航

< 2017年12月 >
26 27 28 29 30 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6

公告

这里的文章多是工作中实际碰到问题记录,一次 bug 花了半天时间才搞定,为避免下次重蹈覆辙,记录之。时间原因博文部分为用心打磨,部分仅为临时记录。还有一些不正确老博文随着后续的认识会更正。如果对你有所帮助,请点下推荐

Thank you for your encouragement.

京东用户体验设计部 招聘 前端工程师 两名,简历请发送至 yfzhoutao#jd.com。

昵称:snandy
园龄:7年10个月
荣誉:推荐博客
粉丝:2741
关注:18+加关注

统计

  • 随笔 - 449
  • 文章 - 0
  • 评论 - 1899

随笔分类(460)

随笔档案(449)

Friend

积分与排名

  • 积分 - 812076
  • 排名 - 102

最新评论

阅读排行榜

评论排行榜

推荐排行榜

Powered by:
博客园
Copyright © snandy