1. 普通字符
[abc] 匹配 [...] 中的所有字符
例如: [aeiou] 匹配字符串 "google runoob taobao" 中所有的 a e i o u
字母
"google runoob taobao".match(/[aeiou]/g) =
["o", "o", "e", "u", "o", "o", "a", "o", "a", "o"]
[^abc] 匹配除了 [...] 中的所有字符
例如: [aeiou] 匹配字符串 "google runoob taobao" 中除了 a e i o u
的字母
"google runoob taobao".match(/[^aeiou]/g) =
["g", "g", "l", " ", "r", "n", "b", " ", "t", "b"]
[A-Z] 所有大写字母,[a-z] 所有小写字母。
. 匹配除换行符(\n、\r)之外的任何单个字符,== [^\n\r]。
2. 转义字符
表达式 |
|
\r, \n |
代表回车和换行符 |
\t |
制表符 |
\\ |
代表 \ 本身 |
\^ |
代表 ^ 本身 |
\$ |
代表 $ 本身 |
\. |
代表 . 本身 |
3. 其他表达式
表达式 |
|
\s,\S |
\s匹配所有空白符,包括换行,\S 非空白符 |
\w |
字母、数字、下划线。等价于 [A-Za-z0-9_] |
\d |
任意一个数字,等价于 [0-9] |
\b |
匹配一个单词边界,单词和空格之间的位置,\B 不匹配任何字符,非单词边界 |
'abv123'.match(/\d\d/g)
'abv123'.match(/b.\d/g)
'weekend,endfor,end'.match(/\bend\b/)
'@-@123abc'.match(/.\b.*/g)
4.修饰符
表达式 |
|
|
{n} |
x = n |
a{5} 相当于 "aaaaa" |
{m,n} |
m <= x <= n |
ba{1,3} 可以匹配 "ba"或"baa"或"baaa" |
{m,} |
x >= m |
\w\d{2,} 可以匹配 "a12","_456","M12344"... |
? |
x=0 || x =1 |
{0,1} |
* |
x>=0 |
{0,} |
+ |
x>=1 |
{1,} |
'It costs $12.5'.match(/\d+\.?\d*/)
'Ads by goooooogle'.match(/go{2,8}gle/)
/[1-9][0-9]*/ /[1-9][0-9]?/ /[1-9][0-9]{0,}/
5.特殊字符
^ --- 匹配输入字符串的开始位置
$ --- 匹配输入字符串的结尾位置
| --- 左右两边表达式之间 "或" 关系,匹配左边或者右边
( ) --- (1). 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
(2). 取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到
'end'.match(/^\w/)
'end'.match(/\w$/)
'it is over'.match(/over|end/)
'123abc'.match(/\d+(\w+)/)
'$10.9,¥20.5'.match(/¥(\d+\.?\d*)/)
6.高级规则
-
*
和 +
限定符都是贪婪的,会尽可能多的匹配文字
'<h1>RUNOOB-菜鸟教程</h1>'.match(/<.*>/)
- 在它们的后面加上一个
?
就可以实现非贪婪或最小匹配
'<h1>RUNOOB-菜鸟教程</h1>'.match(/<.*>/g)
'<h1>RUNOOB-菜鸟教程</h1>'.match(/<.*?>/g)
- 通过在
*
、+
或 ?
限定符之后放置 ?
,该表达式从"贪婪"表达式转换为"非贪婪"表达式或者最小匹配。
7. 选择
-
()
将所有选择项括起来,相邻的选择项之间用 |
分隔, ()
表示捕获分组
'123_zjm@goole.com'.match(/(\w+)@(\w+)/)
-
()
会有一个副作用,使相关的匹配会被缓存,此时可用 ?:
来消除这种副作用。
- 非捕获元有:
?:
?=
和 ?!
'123456789'.match(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g)
// 应用
'1234567890'.replace(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g, '$&,')
8. 预搜索、反向预搜索,不匹配 ?=
?<=
?!
?<!
-
?=
exp1(?=exp2):匹配exp1, 后面 = exp2
'123mine456mine789'.match(/mine(?=[\d+])/)
-
?<=
(?<=exp2)exp1:匹配exp1, 前面 = exp2
'mine-123mine789'.match(/(?<=[\d+])mine/)
-
?!
exp1(?!exp2):匹配exp1, 后面 != exp2
'123mine-456mine789'.match(/mine(?![0-9+])/)
-
?<!
(?<!exp2)exp1:匹配exp1, 前面 != exp2
'123mine-@mine789'.match(/(?<!\d+)mine/)