正则表达式
1.创建正则表达式
①使用对象字面量
let reg=/\bis\b/g;
②使用构造函数
使用构造函数形式需要插入转义字符
let reg2=new RegExp("\\bis\\b","g")
2.正则表达式的组成:
1.原义文本字符
2…原字符
3.一些特殊的符号
let reg=/\bis\b/g;
//is:原义文本字符
//\b g 元字符
// / / 特殊符号
3.正则表达式的三个修饰符:
g:全文搜索
i:忽略大小写
m:多行搜索 搜索的时候识别换行符
示例:let reg=/\bis\b/g;
3.正则表达式中的类:
字符类
当需要匹配一类字符的时候,用[]来构造一个简单的类
[]:匹配其中之一
//匹配abc中的一个
let reg=/[abc]/g;
字符取反类
^:不匹配属于该类的字符
//不匹配abc中的一个,即匹配除了a,b,c之外的字符
let reg=/[^abc]/g;
字符范围类
范围类表示匹配某个范围内的字符
[a-z]
:匹配a到z中的字符,包括a,z的字母
[a-zA-Z0-9]
:匹配a-z A-Z 0-9的字符
说明:
1.按照顺序写 不可以[a-z]
2. 符号‘-’只在两边都有数据的时候才表示范围,单独出现表示符号本身
let str="abc123-123aaaDDD"
str.replace(/[0-9-]/g,"*")
//abc*******aaaDDD"
预定义类
正则表达式提供了一些预定义类,用于快捷的表示一些特定的范围。
.
:除了回车和换行符之外的所有字符
\d
:[0-9] 数字字符
\D
:[^0-9]非数字字符
\s
: 空白符,\f 换页符,\r 回车符,\t 水平制表符,\n 换行符,\x0b 垂直制表符
\S
:非空白符,\f 换页符,\r 回车符,\t 水平制表符,\n 换行符,\x0b 垂直制表符
\w
:单词字符 (字母 数字 下划线)
\W
:非单词字符
\b
:单词边界
\B
:非单词边界
^
:以…开始
$
:以…结束
使用示例:
let str2 = "This is a boy";
str2.replace(/\bis\b/g, "*");
//"This * a boy"
str2.replace(/\Bis\b/g, "*")
//"Th* is a boy"
3.正则表达式中的量词:
?
:出现0/1次
+
: 至少出现一次
*
:可有可无
{n}
:出现n次
{n,m}
:出现n-m次
{n,}
:出现n次及以上
使用示例:
"12345678".replace(/\d{3,6}/g, "*");
//"*78"
说明:
默认情况下正则表达式采用贪婪模式
–尽可能多的匹配,如上例中就匹配了6个数字字符
在量词后加上一个?
来设置成为非贪婪模式
–尽可能少的匹配
"12345678".replace(/\d{3,6}?/g, "*");
//"**78"
4.正则表达式中的分组:
使用()
来进行分组
示例:
"a1b2c3d4".replace(/[a-z]\d{3}/g, "*")
//表示匹配连续3次数字出现字符
//"a1b2c3d4"
"a1b2c3d4".replace(/([a-z]\d){3}/g, "X");
表示匹配连续3次出现字母字符+数字字符
//"Xd4"
5.或:
使用|
表示或:表示左右字符二选一
"ByronCasper".replace(/Byron|Casper/g, "X")
//"XX"
"ByrCasperByronsper".replace(/Byr(on|Ca)sper/g, "X");
//"XX"
6.反向引用:
使用$n(n为索引+1)
引用模式中分组匹配到的文本需要结合分组使用
"2020-03-04" .replace(/(\d{4})-(\d{2})-(\d{2})/g, "$2/$3/$1");
//"03/04/2020"
"aabbcc".replace(/([a-z]{2})([a-z]{2})([a-z]{2})/g,"$3/$2/$1");
//"cc/bb/aa"
6.忽略分组:
当不想捕获分组的时候可以使用?:
来忽略分组
"2020-03-04" .replace(/(\d{4})-(\d{2})-(?:\d{2})/g, "$2/$3/$1");
//"03/$3/2020"
"aabbcc".replace(/([a-z]{2})(?:[a-z]{2})([a-z]{2})/g,"$3/$2/$1");
//"$3/cc/aa"
7.前瞻:
正向前瞻:exp(?=assert)
后面是assert才匹配
负向前瞻:exp(?!assert)
后面不是assert才匹配
"aab1c2cc".replace(/\w(?=\d)/g,"*")
//仅当字符的后面是数字的时候才匹配
//"aa*1*2cc"
"aab1c2cc".replace(/\w(?!\d)/g,"*")
//仅当字符后面不是数字的时候才匹配
//"**b*c***"
8. RegExp对象:
-
RegExp对象的属性:
global
:是否全文搜索,默认为false,只读。
ignoreCase
:是否忽略大小写,默认为fasle,只读。
multiline
:是否多行搜索,默认为fasle,只读。
lastIndex
:当前表达式匹配内容的最后一个字符的下一个位置
source
:正则表达式的文本字符串 -
RegExp对象的方法:
test(str)
:用于测试字符串参数中是否存在匹配正则表达式模式的字符串,返回true/false
exec(str)
:使用正则表达式模式对字符串执行搜索,并将更新全部 RegExp 对象的属性以反映匹配结果,匹配失败返回null。
let reg1 = /\w{1,2}/g
reg1.test("aabb")
//true
reg1.exec("aabb");
//["aa", index: 0, input: "aabb", groups: undefined]0: "aa"groups: undefinedindex: 0input: "aabb"length: 1__proto__: Array(0)
- 正则表达式的相关方法
search(reg)
,用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。返回第一个匹配结果的 index,没有匹配到返回-1。不执行全局匹配。
match(reg)
,检索字符串以找到一个或多个与 regexp 匹配的文本,未找到返回 null,找到后返回一个数组。与 RegExp 的 exec()方法相同。
split(reg)
,利用 regexp 匹配结果作为分隔符对字符串进行分割,返回一个数组。
replace(reg, newStr)
,将 regexp 的匹配结果替换成 newStr,返回一个新字符串。
"aabb".search(/\w{1,2}/g)
//0