一、基础
javascript 允许你通过以下两种方式创建 RegExp 对象,1)直接量。2)使用 RegExp()
var pattern = /java$/; //直接量创建var pattern = new RegExp("java$");
二、元字符
正则表达式中,字母和数字都是按照字面意思进行匹配的,同时javascript 也支持非字母的字符匹配.这些特殊字符需要通过反斜线(\)进行转义.
元字符 描述 . 查找单个字符,除了换行和行结束符。 \w 任何 ascii 字母组成的单词,等价于[a-zA-Z0-9] \W 任何不是 ascii 字母组成的单词,等价于[^a-zA-Z0-9] \d 查找 ascii 的数字,等价于[0-9] \D 查找非 ascii 数字字符,等价于 [^0-9] \s 查找 unicode 空白字符。 \S 查找非 unicode 空白字符。 \b 匹配单词边界。 \B 匹配非单词边界。 \o 查找 NUL 字符。 \n 查找换行符。 \f 查找换页符。 \r 查找回车符。 \t 查找制表符。 \v 查找垂直制表符。 \xxx 查找以八进制数 xxx 规定的字符。 \xdd 查找以十六进制数 dd 规定的字符。 \uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。
三、量词
量词 |
描述 |
{n,m} | 匹配前一项至少 n 次,但不超过 m 次 |
{n,} | 匹配前一项至少 n 次(或大于 n 次) |
{n} | 匹配前一项 n 次 |
? | 匹配前 一项 0 次或 1 次,等价于{0,1},即前一项可选 |
+ | 匹配前一项 1 次或多次,等价于 {1,}, |
* | 匹配前一项 0 次或多次,等价于{0,} |
举例如下:
/\d{3,9}\ //匹配 3~9个数字
/\d{3}\w?/ //匹配三个数组和一个可选字母
/\s+java\s+/ //匹配前后带一个或多个空格的字符串“java”
在量词匹配的情况下,还有一种讨论——最长匹配原则和最短匹配原则(贪婪匹配和非贪婪匹配)。在量词后{n,}?,??,+?,*?。
举个列子来说明一下,如/a+/ 可以匹配字符串”aaa”,尽匹配一次。可换成/a+?/,这个也可以匹配字符串“aaa”,不过这次匹配了3次,非贪婪匹配会尽可能少的匹配,在一次匹配中,只要找到满足条件的字符串就停止当前匹配而开始下一次的匹配。
四、选择、分组和引用
- 字符“|”用于分隔供选择的字符,如“/12|ab|c6/”可以匹配字符串”12”,也可以匹配字符串“ab”或者“c6”;/\d{4}|[a-z]{2,4}/ 可以用来匹配四个数字或者至少两个但不超过四个连续的小写字母。
附带重点说明一下:选择项的匹配次序是从左到右的,如果当中左边的选择项匹配就忽略右边的选择项(即使右边的选择项有更好的匹配,如/a|ab/
- 在正则表达式中,圆括号有着多种作用。
1)把单独的项组合成一个子表达式。如 /(020-)?\d{8}/ 可以匹配广州固定电话的号码,其可以包含分区号020-,也可以不包含。如/(ab|cd)+|\d+/ 可以匹配一个或多个重复的字母ab或cd,也可以匹配多个连续的字母。
2)在完整的模式中定义子模式——当一个正则表达式与目标字符串相匹配时,可以提取圆括号匹配的部分。如火车票的编号形式为/EE\d+/ , 现在我们需要提取出其中的数字,可以这样操作 /EE(\d+)/。
3)允许同一正则表达式里后部引用前面的子表达式(也可以叫做”反向引用“),通过符号 “\” 后加一个数字或多个数字来实现。如 \2 引用的是第二个带圆括号的表达式。注意,因为在圆括号表达式可以嵌套,所以它的位置是参与计数的左括号的位置。如在一个句子中查找重复的单词,可以这样实现:/([a-zA-Z]+) +\1\b/
五、正则表达式的修饰符
字符 | 含义 |
i |
不区分大小写的匹配 |
g |
全局匹配,即找到所有匹配 |
m |
多行匹配,^匹配一行的开头和字符串的开头,$匹配行的结束和字符串的结束 |
方法 | 描述 | 备注 |
compile | 编译正则表达式 |
RegExpObject.compile(regexp,modifier) |
exec | 检索字符串中指定的值。返回找到的值,和其匹配的位置。如果没有找到,返回 null | 如果在一个字符串中完成了一次模式匹配之后要开始检索新的字符串,就必须手动地把 lastIndex 属性重置为 0。 |
test | 判断字符串中是否包含指定的值,返回 true 或者 false |
方法 | 描述 | 备注 |
search | 检索与正则表达式相匹配的值。str.search(regexp)
str.search(str2) |
返回第一个与 regexp 相匹配的子串的起始位置。注意,search方法不支持全局搜索;如果传给search的参数不是regexp对象,会RegExp的构造函数将其转换为一个 regexp 对象 |
match | 找到一个或多个正则表达式的匹配
str.match(regexp) str.match(str2) |
如:”1 + 2 = 3”.match(/\d+/g) 会返回 1,2,3 |
replace | 替换与正则表达式匹配的字符串
str.replace(regexp|str2,replacement) |
如:”I love you”.replae(/love/,"hate”) ;返回 I hate you. |
spilt | 把字符串分隔成字符串数组。
str.spilt(regexp|str,howmany) |
如:“1,2,3”.spilt(“,”) 返回 [“1”,”2”",”3”] |