中括号在正则表达式中的多义性
来源:互联网 发布:知乎中国出口构成 编辑:程序博客网 时间:2024/05/22 05:08
中括号在正则表达式中的多义性
中括号在正则中称为字符组(Character class),有的书翻译为字符类,还有的翻译成字符集。我觉得字符组更好点,毕竟class在计算机属于中代表面向对象里的“类”。顾名思义,字符组为一组字符,它表示在一个位置里可能出现的多种字符。注意这里强调只匹配一个位置哦。
- 简单字符组
- 范围字符组
- 组合字符组
- 排除型字符组
- 字符组运算
- 预定义字符组
一、简单字符组
示例1:[123] 可以分别匹配包含1-3这5个数的字符串。
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。
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:匹配数字
var
reg = /[0-9]/
reg.test(
'0'
)
// -> true
reg.test(
'1'
)
// -> true
reg.test(
'2'
)
// -> true
...
示例4:匹配HTML的标题标签
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. 连字符(-)只在字符组内(中括号)才是元字符。如
var
reg = /1-5/
reg.test(
'1'
)
// -> true
reg.test(
'2'
)
// -> false,不是连字符,不包含2,3,4
reg.test(
'-'
)
// -> true, 这里 “-” 只是一个普通字符
2. 甚至在字符组内部,它也不一定是元字符。如
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]
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:匹配非数字字符
var
reg = /[^0-9]/
reg.test(
'1'
)
// -> false
reg.test(
'2'
)
// -> false
reg.test(
'a'
)
// -> true
五、字符组运算(方括号嵌套+运算符)
有些语言支持,比如&&+[] Java中就支持,但JavaScript不支持。
示例7:匹配英文字母中除去元音字符的字符
[[a-z]&&[^aeiou]]
// a-z 且排除掉5个元音字符aeiou
六、预定义字符组(又称字符组简记)
比如JavaScript中提供了 \d, \w, \s 表示数字字符组(digit),单词字符组(word),和空白符字符组(space)。另外还有对于的排除型字符组简写 \D,\W,\S 分别对于非数字字符组,非单词字符组,非空白字符组。
\d == [0-9]
\w == [a-zA-Z_0-9]
\s == [ \t\n\x0B\f\r]
- 中括号在正则表达式中的多义性
- 正则表达式小括号的多义性
- 正则表达式小括号的多义性
- 正则表达式小括号的多义性
- 正则表达式小括号的多义性
- Javascript中括号“[]”的多义性
- 正则表达式中的括号
- Javascript 中的小括号 “()” 的多义性
- Javascript中大括号“{}”的多义性
- 解析Javascript中大括号“{}”的多义性
- Javascript中大括号“{}”的多义性
- php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
- php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
- php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
- JavaScript小括号、中括号、大括号的多义性
- JavaScript小括号、中括号、大括号的多义性
- JavaScript小括号、中括号、大括号的多义性
- JavaScript小括号、中括号、大括号的多义性
- ubuntu 14.04开机出现错误“Error found when loading /root/.profile”解决
- 深度学习:概述和一孔之见 浅谈深度学习中潜藏的稀疏表达
- java 什么时候使用内部类
- 练习5-8 函数day_of_year和month_day中没有进行错误检查,请解决该问题
- [LeetCode]problem 3. Longest Substring Without Repeating Characters
- 中括号在正则表达式中的多义性
- Python学习零碎比较
- JavaScript检测之basevalidate.js
- leetcode 347. Top K Frequent Elements 解题报告
- UVa227 Puzzle
- 如何移植μC/GUI在OLED12864上显示
- java数据写入数据库错误
- 基于c#环境的单片机和PC串口通信
- Linux spi驱动 (一)