文章目录
- 正则表达式
- 使用test方法
- 匹配文字字符串
- 匹配多种可能性的文字字符串: `|`
- 忽略大小写: `i`
- 使用match()方法提取匹配项
- 全局匹配: `g`
- 通配符:匹配任何内容: `.`
- 单个字符多可能性匹配: `[abc]`
- 匹配字母表中的字母: `[a-z]`
- 匹配字母表中的数字和字母
- 创建否定字符集: `[^abc]`
- 匹配出现一次或多次的字符: `+`
- 匹配出现零次或多次的字符: `*`
- 用惰性匹配来查找字符: `?`
- 匹配字符串的开头: `/^abc/`
- 匹配字符串的末尾: `$`
- 匹配所有的字母和数字: `\w`
- 匹配所有数字: `\d`
- 匹配所有非数字: `\D`
- 一些缩写字符的用法
- 指定匹配的上限和下限: `{3,5}`
- 检查全部或无: `a?`
- 正向先行断言和负向先行断言: `(?=abc)` `(?!abc)`
- 检查混合字符组: `(abc|def)`
- 使用捕获组重用模式: `/(abc)\1/`
- 使用捕获组搜索和替换: `.replace(reg,str)`
- 删除开头和结尾的空白
正则表达式
使用test方法
let testStr = "you are a genius";
let testRegex = /are/;
let hasAre = testRegex.test(testStr);
//返回值:true
匹配文字字符串
正则表达式 /hello/
匹配字符串 'hello'
。
匹配多种可能性的文字字符串: |
使用 |
操作符来匹配多个规则
let reg = /only|life/;
忽略大小写: i
忽略大小写的标志 i
let reg = /hi/i;
使用match()方法提取匹配项
match()
方法返回目标字符串中与正则表达式匹配的一个或多个子字符串
let matchArr = "Hello, World!".match(/Hello/);
// Hello
let ourStr = "my have two cats and three dogs.";
let ourArr = ourStr.match(/cats|dogs/g);
// ['cats', 'dogs']
全局匹配: g
标志 g
可用于多次搜寻匹配的内容。
let testStr = "repeat, repeat, repeat";
let reg = /repeat/g;
let result = testStr.match(reg);
// ["repeat", "repeat", "repeat"]
通配符:匹配任何内容: .
通配符 .
可用来匹配任何一个字符。
let testStr = "I'll have a dog";
let reg = /ha./;
let result = reg.test(testStr);
// true
单个字符多可能性匹配: [abc]
将字符集放在[]
之间来定义需要匹配的字符串,例如[aiu]
表示只匹配字符a
、i
或 u
。
let reg = /b[aiu]g/
let testStr1 = "big"; // true
let testStr2 = "bag"; // true
let testStr3 = "bug"; // true
let testStr4 = "bog"; // false
匹配字母表中的字母: [a-z]
在字符集中,可以使用连字符 -
来定义要匹配的字符范围,例如 [a-e]
表示匹配小写字母 a 到 e 的字符
匹配字母表中的数字和字母
同样使用连字符 -
可以匹配一系列的数字,例如 [0-5]
表示匹配 0 到 5 的数字
匹配字符串中的所有字母和数字 /[a-z0-9]/ig
。
创建否定字符集: [^abc]
否定字符集:不想匹配的字符集合。
在开始括号后面和不想匹配的自负前面放置插入符号 ^
,例如 /[^aeiou]/gi
表示匹配所有非元音字符。
匹配出现一次或多次的字符: +
使用符号 +
来匹配出现一次或连续多次的字符(或字符组)。
let str1 = "abc";
let str2 = "aabc";
let str3 = "abab";
let str4 = "bcd";
let reg = /a+/g;
str1.match(reg) // ["a"]
str2.match(reg) // ["aa"]
str3.match(reg) // ["a", "a"]
str4.match(reg) // null
匹配出现零次或多次的字符: *
使用符号*
来匹配出现零次或多次的字符。
let str1 = "gooood!";
let str2 = "gut";
let str3 = "over";
let reg = /go*/;
str1.match(reg) // ["goooo"]
str2.match(reg) // ["g"]
str3.match(reg) // null
用惰性匹配来查找字符: ?
贪婪
匹配:匹配到符合正则表达式匹配模式的字符串的最长可能部分,将其返回。
惰性
匹配:匹配到符号正则表达式匹配模式的字符串的最小可能部分,将其返回。
正则表达式默认使用的是贪婪
匹配,使用?
字符,可以使其变成惰性
匹配。
例如:
let str = "titanic";
//默认情况下的贪婪匹配
let reg1 = /t[a-z]*i/;
str.match(reg1) // ["titani"]
//使用问好字符串变为惰性匹配
let reg2 = /t[a-z]*?i/;
str.match(reg2) // ["ti"]
匹配字符串的开头: /^abc/
在字符集中符号^
用来创建一个否定字符集,例如:[^0-5]
;
在字符集之外,符号^
匹配输入字符串的开始位置,例如:
let str1 = "Loen is first and can be found.";
let str2 = "You can't find Loen now.";
let res = /^Loen/;
reg.test(str1) //true
reg.test(str2) //false
匹配字符串的末尾: $
使用符号$
来匹配字符串的结尾,例如:
let str1 = "This is a never ending story";
let str2 = "Sometimes a story will have to end";
let reg = /story$/;
reg.test(str1) //true;
reg.test(str2) //false;
匹配所有的字母和数字: \w
从前面的知识中可以知道,使用字符集我们可以匹配所有的字母和数字,使用/[A-Za-z0-9]+/
;
而缩写字符\w
等同于[A-Za-z0-9_]
,它不仅可以匹配大小写字母和数字,还会匹配下划线(_
)。
let str = "important_var";
let reg = /\w+/;
reg.test(str); //true
匹配所有数字: \d
缩写字符\d
等同于[0-9]
。
let str = "This building is 400 meters high.";
let reg = /\d/'
str.match(reg) // ["4"]
匹配所有非数字: \D
缩写字符\D
等同于[^0-9]
。
let str = "This building is 400 meters high.";
let reg = /\D/;
str.match(reg); //["T"]
一些缩写字符的用法
正则表达式/^[a-z]([0-9]{2,}|[a-z]+\d*)$/i
的匹配要求为:
- 用户名只能是数字字母符号
- 用户名中的数字必须在最后,且数字可以有零个或多个
- 用户名字母可以是大写字母和小写字母
- 用户名长度必须至少为两位
指定匹配的上限和下限: {3,5}
使用数量说明符和花括号{}
来指定匹配模式的上限和下限,例如:/a{3,5}/
表示 a 仅可以出现3到5次。
let str1 = "aaaah";
let str2 = "aah";
let reg = /a{3,5}h/;
reg.test(str1) //true
reg.test(str2) //false
若想要只指定匹配的下限,同样可以使用花括号{}
,例如:{3,}
表示匹配出现3次或3次以上的;
注:无法只指定匹配的上限,必须指定一个最小值,例如:{0,5}
表示匹配出现5次或5次以下的。
指定匹配的确切数量,则不使用区间,{3}
即表示出现3次的。
检查全部或无: a?
当想要匹配不确定是否存在的部分时,可以使用?
操作符,这将检查前面的零个或一个元素,可将此符号前面的元素视为:可选的
。
let str1 = "color";
let str2 = "colour";
let reg = /colou?r/;
reg.test(str1); // true
reg.test(str2); // true
正向先行断言和负向先行断言: (?=abc)
(?!abc)
先行断言
:在字符串中向前查找的匹配模式,有两种先行断言
:正向先行断言
和负向先行断言
。
正向先行断言
会查看并确保搜索匹配模式中的元素存在,但实际上并不匹配,使用(?=...)
来表示
负向先行断言
会查看并确保搜索匹配模式中的元素不存在,如果负向先行断言部分不存在,将返回匹配模式的其余部分,使用(?!...)
来表示。
let str1 = "qu";
let str2 = "qt";
let reg1 = /q(?=u)/;
let reg2 = /q(?!u)/;
str1.match(reg1) // ["q"]
str2.match(reg2) // ["q"]
先行断言
的更实际用途是检查一个字符串中的两个或更多匹配模式,例如:/(?=\w{3,6})(?=\D*\d)/
表示3到6个字符且至少包含一个数字。
检查混合字符组: (abc|def)
在正则表达式里使用括号()
来检查字符串组,例如:/(clik|app)/
。
let str = "Pumpkin";
let reg = "/P(engu|umpk)in/";
reg.test(str) // true
使用捕获组重用模式: /(abc)\1/
使用捕获组来搜寻重复的字符串,捕获组是括号(xx)
内的正则表达式搜索到的内容,你需要指定重复字符串将出现的位置,使用\1
的形式,表示可以匹配第一个组。
例如:/(abc)\s\1\s\1/
则匹配字符串abc abc abc
。
使用捕获组搜索和替换: .replace(reg,str)
使用.replace(reg,str)
方法将正则表达式reg搜索匹配到的内容替换为str里面的内容,例如:
let str = "The sky is silver.";
let reg = "/silver/";
str.replace(reg, "blue") // The sky is blue.
还可以使用美元符号$
来访问捕获组:
"Code Learn".replace(/(\w+)\s(\w+)/, '$2 $1');
// "Learn Code"
删除开头和结尾的空白
- 匹配开头的空白/^(\s+)/
- 匹配结尾的空白/(\s+)$/
- 使用
.replace()
方法替换匹配到的内容