小白正则表达式入门学习:正则表达式30分钟入门教程
正则表达式Regular Expression是一种文本模式。它描述了一种字符串匹配的模式pattern,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
我们将正则表达式分为几个部分记下笔记,便于理解与使用。
1. 元字符
我们在 MDN-Regular_Expression 上得知,正则表达式会有一些特殊字符,也叫作元字符。如下表示:
字符 | 含义 | 英语记忆或者个人记忆方法 |
---|---|---|
匹配字符 | ||
\b | 匹配一个单词边界,也就是指单词和空格间的位置。一个匹配的词的边界的内容的长度是0。(不要和[\b]混淆了) | blank |
\B | 匹配非单词边界。一个字符串的开始和结尾都被认为不是“字”字符,或者空字符串 | Blank,b与B相反 |
\d | 匹配一个数字字符。等价于 [0-9] | digit |
\D | 匹配一个非数字字符。等价于 [^0-9] | Digit,d与D相反 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 | space |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 | Space, s与S相反 |
\w | 匹配字母、数字、下划线。等价于’[A-Za-z0-9_]’ | word |
\W | 匹配非字母、数字、下划线。等价于 ‘[^A-Za-z0-9_]’ | Word,w与W相反 |
匹配特殊字符 | ||
\t | 匹配一个制表符 (\x09)。 | Table |
\n | 匹配一个换行符 (\x09A)。 | New line |
\f | 匹配一个换页符 (\x09C)。 | Page break#Form feed |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK。 | Vertical table |
\r | 匹配一个回车符 (\x09D)。 | Return |
\ | 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。 | 反斜杠也可以将其后的特殊字符,转义为字面量,当需要使用\ 时也需要将其转义 |
x | y | 匹配 x 或 y | 或运算 |
^ | 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置 | 开始 |
$ | 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置 | 结束 |
匹配内容次数 | ||
* | 匹配前面的子表达式零次或多次 | `{0, n} |
+ | 匹配前面的子表达式一次或多次 | {1, n} |
? | 匹配前面的子表达式零次或一次 | {0, 1} |
匹配分组 | ||
(pattern) | 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,JS 使用 $0…$9 属性获取匹配结果 |
匹配括号内部的正则表达式结果 |
[xy] | 字符集合,匹配所包含的任意一个字符 | 匹配[]内部的内容,即x y |
[^xy] | 字符集合,匹配所包含的任意一个字符 | 匹配[]内部的内容,即不是x y 的任意一个字符 |
[a-z] | 字符集合,匹配所包含的任意一个字符 | 匹配[]内部的内容,即a-z 之间任意一个字符 |
[^a-z] | 负值字符范围。匹配任何不在指定范围内的任意字符 | 匹配[]内部的内容,即不是a-z 之间任意一个字符 |
{n} | n 是一个非负整数。匹配确定的 n 次 |
匹配连续出现n 次的字符 |
{n,} | n 是一个非负整数。至少匹配n 次 |
匹配至少出现n 次的字符 |
{n,m} | m 和 n 均为非负整数,其中n <= m 。最少匹配 n 次且最多匹配 m 次 |
匹配出现 [n, m] 次字符 |
- 优先级:正则表达式从左到右进行计算,并遵循优先级顺序
下面我们讲上述元字符一个一个的测试.
不过,在测试之前,我们先了解两个正则表达式的方法,test() 和 exec()。
元字符\b
与\B
从上面结果得知,b匹配的是单词的边界,B匹配的是非单词的边界
元字符\d
与\D
元字符\s
与\S
元字符\w
与\W
2. 参数
参数列表 | 含义 | 英语记忆或者个人记忆方法 |
---|---|---|
i | 忽略大小写 | ignoreCase |
g | 全文查找出现的所有匹配字符 | global |
m | 多行查找 | multiline |
y | 执行“粘性”搜索,匹配从目标字符串的当前位置开始,可以使用y标志 | sticky |
当然,上面这几种匹配规则可以结合使用,例如/ig
或者/gi
都是全文查找、忽略大小写
3. 方法
方法 | 含义 | 匹配返回值 | 未匹配返回值 |
---|---|---|---|
test() | 测试是否匹配的RegExp方法 | true | false |
exec() | 执行查找匹配的RegExp方法 | 数组 | null |
match(pattern) | 执行查找匹配的String方法 | 数组 | null |
search(pattern) | 测试匹配的String方法 | 返回匹配到的位置索引 | -1 |
replace(pattern, obj || callback) | 执行查找匹配的String方法,并且使用替换字符串替换掉匹配到的子字符串 | 一个新的字符串 | null |
split | 一个使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后的子字符串存储到数组中的String方法 | 返回一个数组 | null |
下面我们讲上述方法一个一个的详细介绍。
test(str)
param:str
result:
匹配成功:
如果正则表达式与指定的字符串匹配 ,返回true
匹配失败:
false
exec(str)
param:str
result:
匹配成功:
exec() 方法返回一个数组,并更新正则表达式对象的属性。返回的数组将完全匹配成功的文本作为第一项,将正则括号里匹配成功的作为数组填充到后面。
匹配失败:
如果匹配失败,exec() 方法返回 null。
对象 | 属性/索引 | 描述 |
---|---|---|
result | [0] | 匹配的全部字符串 |
[1], …[n] | 括号中的分组捕获 | |
index | 匹配到的字符位于原始字符串的基于0的索引值 | |
input | 原始字符串 | |
regexp | lastIndex | 下一次匹配开始的位置 |
ignoreCase | 是否使用了 “i” 标记使正则匹配忽略大小写 | |
global | 是否使用了 “g” 标记来进行全局的匹配 true | |
multiline | 是否使用了 “m” 标记使正则工作在多行模式(也就是,^ 和 $ 可以匹配字符串中每一行的开始和结束(行是由 \n 或 \r 分割的),而不只是整个输入字符串的最开始和最末尾处。) | |
source | 正则匹配的字符串 |
match(pattern)
search(pattern)
replace(pattern, obj || callback)
split
未完待续ing