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体验平台全面上线
最新IT新闻:· AOL创始人成立新基金 获贝索斯和施密特等人1.5亿美元投资
· 安卓Go系统交付硬件厂商 专为512M或1G内存手机设计
· 怒赞!上海人率先体验支付宝刷脸坐地铁 语音购票
· 苹果刚刚宣布2011 Mac迷你电脑为“淘汰产品”
· 还买什么比特币,快来以太坊里“链养猫”!
» 更多新闻...
最新知识库文章:· 以操作系统的角度述说线程与进程
· 软件测试转型之路
· 门内门外看招聘
· 大道至简,职场上做人做事做管理
· 关于编程,你的练习是不是有效的?
» 更多知识库文章...
导航
|
||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
|---|---|---|---|---|---|---|
| 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)
- Ajax/Fetch(24)
- Algorithms(6)
- Bug(28)
- Compatibility(64)
- CSS/LESS(11)
- Data structures(2)
- DOM/Event(29)
- ECMAScript(16)
- ExtJS(16)
- HTML(11)
- HTTP(1)
- J2EE(2)
- Java(4)
- JavaScript(93)
- jQuery(35)
- Modular JS(17)
- MVC(5)
- Node(16)
- Objective-C(1)
- OS(17)
- Patterns(6)
- Perl(5)
- Programming(14)
- Regexp(3)
- Tool(15)
- Widget(19)
随笔档案(449)
- 2017年4月 (3)
- 2016年11月 (1)
- 2016年9月 (1)
- 2016年8月 (1)
- 2016年7月 (1)
- 2016年6月 (1)
- 2016年4月 (2)
- 2016年3月 (5)
- 2016年1月 (1)
- 2015年12月 (2)
- 2015年11月 (1)
- 2015年10月 (6)
- 2015年9月 (2)
- 2015年8月 (1)
- 2015年7月 (2)
- 2015年6月 (2)
- 2015年5月 (7)
- 2015年4月 (3)
- 2015年1月 (2)
- 2014年12月 (2)
- 2014年11月 (5)
- 2014年10月 (4)
- 2014年9月 (2)
- 2014年8月 (2)
- 2014年7月 (1)
- 2014年6月 (4)
- 2014年5月 (7)
- 2014年4月 (3)
- 2014年3月 (6)
- 2014年2月 (1)
- 2014年1月 (2)
- 2013年12月 (1)
- 2013年11月 (5)
- 2013年10月 (1)
- 2013年9月 (4)
- 2013年8月 (5)
- 2013年7月 (6)
- 2013年6月 (4)
- 2013年5月 (12)
- 2013年4月 (3)
- 2013年3月 (5)
- 2013年2月 (4)
- 2013年1月 (6)
- 2012年12月 (2)
- 2012年11月 (12)
- 2012年10月 (1)
- 2012年9月 (6)
- 2012年8月 (2)
- 2012年6月 (6)
- 2012年5月 (15)
- 2012年4月 (17)
- 2012年3月 (21)
- 2012年2月 (6)
- 2011年11月 (1)
- 2011年10月 (5)
- 2011年9月 (16)
- 2011年8月 (13)
- 2011年7月 (8)
- 2011年6月 (13)
- 2011年5月 (14)
- 2011年4月 (47)
- 2011年3月 (90)
- 2011年2月 (14)
- 2010年4月 (1)
Friend
积分与排名
- 积分 - 812076
- 排名 - 102
最新评论
- 1. Re:读jQuery之一(对象的组成)
- @IT民工磊边读源码,边调试代码。调试加深理解。...
- --snandy
- 2. Re:读jQuery之一(对象的组成)
- 您好楼主,首先很喜欢您写的文档,其次问一下,这个Jquery 您是直接读源码理解还是参考些什么资料读,谢谢
- --IT民工磊
- 3. Re:JavaScript中奇葩的假值
- @广场上的青年‘’这个东西转换为布尔值后就是false,所以console.log(''==false);本质上是执行了console.log(false==false);结果肯定为true......
- --小鑫先生
- 4. Re:微信公众账号开发入门
- 请问这个难的,刚接触这个
- --紫泪QQ3079577974
- 5. Re:使用UglifyJS合并/压缩JavaScript
- 定义完了buildOne这个方法,去哪调用呢
- --wy712
- 6. Re:JavaScript中奇葩的假值
- 楼主有没有试过这样子的console.log(' ' == false),单引号里面有一个空格,返回的结果却是真,不知道怎么回事。
- --广场上的青年
- 7. Re:ES6块级作用域及新变量声明(let)
- 很细致
- --DaisyF
- 8. Re:JavaScript生成GUID的算法
- 楼主写这篇文章的时候,显然没有真正理解什么是GUID
- --秋荷雨翔
- 9. Re:读jQuery之六(缓存数据)
- Jquery插件集:
- --夏天地
- 10. Re:JavaScript数字精度丢失问题总结
- @splurgeLife负数计算问题已修复,谢谢提醒...
- --snandy
阅读排行榜
- 1. RequireJS入门(一)(174696)
- 2. Mac OS X中配置Apache(121238)
- 3. JavaScript中清空数组的三种方式(87892)
- 4. JavaScript声明全局变量三种方式的异同(75757)
- 5. RequireJS入门(二)(64859)
- 6. 判断JS对象是否拥有某属性(63217)
- 7. 单例/单体模式(Singleton)(59082)
- 8. JavaScript判断图片是否加载完成的三种方式(53995)
- 9. 字符串转换成JSON的三种方式(52732)
- 10. Java用for循環Map(50297)
评论排行榜
- 1. JavaScript的写类方式(1)(41)
- 2. JavaScript中__proto__与prototype的关系(37)
- 3. 坑爹的JS笔试题(持续更新)(34)
- 4. 在循环中正确找到对应DOM元素的索引(34)
- 5. 写了10年Javascript未必全了解的连续赋值运算(32)
- 6. Javascript自由拖拽类(30)
- 7. 跨域iframe的高度自适应(24)
- 8. RequireJS入门(一)(24)
- 9. JavaScript中函数声明优先于变量声明(23)
- 10. 前端开发调试线上代码的两款工具(19)
推荐排行榜
- 1. RequireJS入门(一)(57)
- 2. JavaScript中__proto__与prototype的关系(31)
- 3. 前端开发调试线上代码的两款工具(29)
- 4. Javascript自由拖拽类(28)
- 5. 在循环中正确找到对应DOM元素的索引(25)
- 6. JavaScript的写类方式(1)(24)
- 7. RequireJS入门(三)(24)
- 8. RequireJS入门(二)(24)
- 9. 读jQuery之一(对象的组成)(23)
- 10. 单例/单体模式(Singleton)(22)
博客园
Copyright © snandy