1.正则表达式的定义
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码
一个正则表达式,就是用某种模式去匹配一类字符串的一个公式。
2.JS创建正则表达式
let regExpObj = new RegExp("a[0-9]"); // 使用构造函数
let regExpObj2 = /a[0-9]/; // 常用使用正则表达式字面量
3.正则表达式标志
标志 | 含义 | 示例 |
---|---|---|
i | 执行匹配时,忽略大小写 | /a[0-9]/只能匹配小写字母a后面接一位数字。/a[0-9]/i进行匹配时,忽略字母a的大小写 |
g | 全局匹配。如果没有该标志,则找到第一个匹配之后就会停止匹配。 | /a[0-9]/只进行一次匹配/a[0-9]/g进行多次匹配例如,当需要判断字符串str中是否包含某类字符串时,就不需要标志g。而需要将字符串中某类字符串全部替换掉时,则需要使用标志g |
m | 多行模式。此时,^匹配整个字符串的开头或一行的开头;$匹配整个字符串的结尾或一行的结尾。 | /a/匹配以a开头的字符串。/a/m匹配以a开头的字符串或者字符串中某一行以a开头 |
4.使用正则表达式
1.调用RegExp对象的相关方法
不管regExpObj有无全局标志g,每调用一次test()或exec ()方法,
均只执行一次匹配。
不同的是,如果有全局标志,则执行时会记录lastIndex属性,下一次再执行时,从lastIndex属性开始匹配。
// test()方法 如果string中含有与regExpObj相匹配的文本,则返回true。否则返回false
let regExpObj2 = /^a[0-9]$/;
let str = "a2";
console.log(regExpObj2.test(str));// true
// exec()方法 返回一个数组,其中存放匹配的结果(该数组的第一个元素为[匹配的文本,其余元素为正则表达式的子表达式的值)。如果未找到匹配,则返回值为null
let regExpObj = new RegExp("a[0-9]");
let regExpObj2 = /a[0-9]/g;
let str = "111a2111111a1a1a1a1565656a2";
console.log(regExpObj2.exec(str));
//["a2", index: 3, input: "111a2111111a1a1a1a1565656a2", groups: undefined]
console.log(regExpObj2.exec(str));
//["a1", index: 11, input: "111a2111111a1a1a1a1565656a2", groups: undefined]
2.调用String对象的相关方法
// search()方法 返回stringObject 中第一个与 regexp 相匹配的子串的起始位置下标。如果没有找到任何匹配的子串,则返回 -1,该方法忽略全局标志g
let regExpObj2 = /a[0-9]/g;
let str = "111a2111111a1a1a1a1565656a2";
console.log(str.search(regExpObj2)); // 3
// match()方法 存放匹配结果的数组。如果regexp没有全局标志g,则match() 方法就只能在 stringObject 中执行一次匹配;否则,match() 方法就执行多次匹配,返回stringObject 中所有匹配的子字符串。
let regExpObj2 = /a[0-9]/g;
let str = "111a2111111a1a1a1a1565656a6";
console.log(str.match(regExpObj2));
// ["a2", "a1", "a1", "a1", "a1", "a6"]
// replace()方法 返回一个新的字符串,是用 参数2 替换了 参数1 的第一次匹配或所有匹配之后得到的 如果 regexp 具有全局标志 g,那么 replace() 方法将替换所有匹配的子串。否则,它只替换第一个匹配子串
let regExpObj2 = /a[0-9]/g;
let str = "111a2111111a1a1a1a1565656a6";
console.log(str.replace(regExpObj2,"W"));
//111W111111WWWW565656W
5.正则表达式的结构
1.字符直接量
字符直接量即普通的字符,在正则表达式没有特殊的含义。如:/java/ 就与所有的包含字串”java”的字符串相匹配。
常见直接量:
直接量 | 匹配 |
---|---|
字母,数字 | 自身 |
\n | 换行符 |
\t | 制表符 |
\r | 回车符 |
\f | 换页符 |
2.元字符
正则表达式中有许多标点符号有着特殊的含义。例如:^代表字符串的开头,$代表字符串的结尾,点号.表示出换行符之外的任意字符,等等。这些字符称为元字符。
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
如果需要以直接量的形式使用元字符,则需使用\来转义。例如,如果表示直接量字符,在使用正则表达式字面量时就需要转义,写出^;在使用RegExp构造函数时,需使用\转义,写成\。
3.字符转义
如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用.和*。当然,要查找\本身,你也得用\.
例如:
deerchao\.cn匹配deerchao.cn,C:\\Windows匹配C:\Windows。
6.正则表达式语法
无论是使用/..的形式还是使用构造函数RexExp(),创建一个RegExp对象都是比较简单的,较为困难的是使用正则表达式的语法来描述字符的模式。
字符类:
1.将直接量字符放进方括号内,就可以组合成字符类
例如,正则表达式/[abc]/就和字母“a",或者“b",或者”c"相匹配,加上^表示非
2.如果要表示某个范围内的字符,还可以使用连字符
例如,正则表达式/[0-9]/就表示0-9数字字符
3.某些字符类用的非常多,所以Javascript中包含了一些特殊字符和转义序列来表示这些常用的字符类.
例如,\s表示任意的空白字符,\S表示任意的非空白字符
字符 | 匹配 |
---|---|
[...] | 某个范围内的任意单个字符 |
[^...] | 不在某个范围内的任意单个字符 |
. | 任意字符(换行符等行终止符除外) |
\w | 任意单字字符 |
\W | 任意非单字字符,等价于[^a-zA-Z0-9 |
\s | 任意单个空白符 |
\S | 除空白符以外的单个字符 |
\d | 任意单个数字字符。等价于[0-9] |
\D | 除数字字符之外的任意单个字符。等价于[^0-9 |
量词(重复)
例如:/\d{2}/ 表示出现2个单个数字字符
量词 | 含义 |
---|---|
{n} | 正好出现n次 |
{n,m} | 至少出现n次,不多于m次 |
{n,} | 至少出现n次 |
? | 出现0次或者1次。等价于{0,1} |
+ | 出现一次或多次 |
* | 出现零次或多次 |
候选(分支条件)
有时要构建一个匹配所有可能性的模式是很困难的。例如,要用正则表达式匹配”hello”和" javascript”要如何做呢?
正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。
正则表达式提供了候选操作符“I"来解决这种问题。候选操作符类似于“或者”
例如:/16位身份证|18位身份证/
子表达式 (分组)
我们已经提到了怎么重复单个字符(直接在字符后面加上限定符就行了);但如果想要重复多个字符又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作
用于处理字符序列
例如要匹配/hellohello/
使用子表达式,可以写成
/(hello){2}/
反义
有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义:
代码/语法 | 说明 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
锚字符
用来匹配字符位置
锚字符 | 含义 |
---|---|
\b | 匹配词语的边界,即位于\w和\W之间的位置 |
\B | 匹配非词语边界的字符 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾 |
以上是正则表达式的常用内容,还有很多内容笔者没有介绍,想看详细内容请看这篇文章
https://deerchao.cn/tutorials/regex/regex.htm#top