因为最近刷题时,老是遇到精彩的正则表达式的使用方式,于是在这里进行一个集中的复习记录,这里主要记录正则表达式中各种符号的匹配对象,与复杂的符号匹配对象示例。
参考对象:https://deerchao.cn/tutorials/regex/regex.htm
| 符号 | 匹配对象 | 示例 |
|---|---|---|
| i | 执行对大小写不敏感的匹配 | |
| g | 执行全局匹配 | |
| m | 执行多行匹配 | |
| . | 查找单个字符,除了换行和行结束符 | |
| * | 匹配任意零个、单个或多个字符(除换行符以外) | *.txt 匹配所有的 txt 文件 |
| + | 匹配一个或更多个 | \d+ 匹配一个或多个数字 |
| ? | 除换行符以外的任意一个字符 | c?t 匹配所有以 c 开头,t 结尾的三个字母的字符串 |
| ^ | 匹配字符串的开始,匹配一个位置 | |
| $ | 匹配字符串的结束,匹配一个位置 | |
| \ | 转义字符,用于查找字符本身 | . 匹配 “.” 本身 |
| [ ] | 匹配括号内指定的字符 | |
| '|' | 分枝符号 | , 用来把不同的规则分隔开,相当于if else | 0\d{2}-\d{8}|0\d{3}-\d{7}可以匹配两种情况 一是“3位数字 - 8位数字”(如010-12345678) 二是“4位数字 - 7位数字” (如0376-2233445) |
| {n} | 匹配 {n} 前面的字符 n 个 | \d{2} 匹配2个数字, \d{3,} 匹配3到n个数字, \d{5,12} 匹配5到12个数字 |
| ( ) | 分组,用于分割表达式,指定子表达式 | (\d{1,3}.){3} 匹配3位数字加上1个英文句号(这个整体也就是这个分组) 重复3次 |
| \f | 匹配一个换页符 | |
| \n | 匹配一个换行符 | |
| \t | 匹配一个制表符 Tab | |
| \v | 匹配一个垂直制表符 | |
| \r | 匹配一个回车 | |
| \e | 匹配 Escape | |
| \s | 匹配任意的空白符,包括空格、制表符、换页符等等, 等价于[ \f\n\r\t\v] | |
| \S | 匹配任意不是空白符的字符 | \S+ 匹配不包含空白符的字符串 |
| \b | 匹配单词的分界处 | \bhi\b 精准匹配 hi 这个单词 |
| \B | 匹配不是单词开头或结束的位置 | |
| \w | 匹配一位字母、数字、下划线、汉字 | |
| \W | 匹配任意不是字母,数字,下划线,汉字的字符 | |
| \z | 字符串结尾,类似 $ | |
| \Z | 字符串结尾或行尾 | |
| \d | 匹配一位数字 | |
| \D | 匹配任意非数字的字符 | |
| \A | 匹配字符串开头,类似 ^ | |
| ^ | 除xxx之外的任意字符 | [^x] 匹配除了x以外的任意字符 [^aeiou] 匹配除了aeiou这几个字母以外的任意字符 |
| (?=exp) | 零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp | \b\w+(?=ing\b) 匹配以ing结尾的单词的前面部分(除了ing以外的部分)匹配I'm singing while you're dancing.时,它会匹配sing和danc |
| (?<=exp) | 零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp | (?<=\bre)\w+\b 会匹配以re开头的单词的后半部分(除了re以外的部分),匹配reading a book时,它匹配ading |
| (?!exp) | 零宽度负预测先行断言,断言此位置的后面不能匹配表达式exp | \d{3}(?!\d) 匹配三位数字,而且这三位数字的后面不能是数字 \b((?!abc)\w)+\b 匹配不包含连续字符串abc的单词。 |
| (?<!exp) | 零宽度负回顾后发断言,断言此位置的前面不能匹配表达式exp | (?<![a-z])\d{7}匹配前面不是小写字母的七位数字。 |
| (?#comment) | 在正则语句中包含注释 | 2[0-4]\d(?#200-249) | 25[0 - 5](?#250-255)|[01]?\d\d?(?#0-199) 匹配200-249或者250-255或者0-199 |
| (exp) | 匹配exp,并捕获文本到自动命名的组里 | |
| (?<name>exp) | 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) | |
| (?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 |
常用正则表达式
| 表达式 | 描述 |
|---|---|
| [abc] | 查找方括号之间的任何字符。 |
| [^abc] | 查找任何不在方括号之间的字符。 |
| [0-9] | 查找任何从 0 至 9 的数字。 |
| [a-z] | 查找任何从小写 a 到小写 z 的字符。 |
| [A-Z] | 查找任何从大写 A 到大写 Z 的字符。 |
| [A-z] | 查找任何从大写 A 到小写 z 的字符。 |
| /^([\w+\.])+@\w+([.]\w+)+$/ | 匹配正确的邮箱格式 |
正则的实例方法:
exec()
方法描述:检索字符串中指定的值。返回找到的值,并确定其位置。
语法:
regObj.exec(string)
参数:
regObj: 必需。正则表达式。
string:必需。要检索的字符串。
返参:
1.找到匹配,返回一个数组[val0,val1,val2,...,index,input],存放匹配结果。并更新正则表达式对象的 lastIndex 属性。
val0:与正则匹配的全部字符串
val1:与正则第1个子表达式匹配的文本
val2:与正则第2个子表达式匹配的文本,以此类推
index:标示匹配文本第一个字符的位置
input:存放被检索的字符串
2.未找到匹配,返回 null,并将 lastIndex重置为 0 。
示例:
let regObj = /quick\s(brown).+?(jumps)/ig;
let str = "The Quick Brown Fox Jumps Over The Lazy Dog";
console.log(regObj.exec(str));
// res = [
// 0:"Quick Brown Fox Jumps",
// 1:"Brown",
// 2:"Jumps"
// groups: undefined
// index:4,
// input:"The Quick Brown Fox Jumps Over The Lazy Dog"
// ]
test()
方法描述:用来查看正则表达式与指定的字符串是否匹配。
语法:
regexObj.test(string)
参数:
regObj: 必需。正则表达式。
string:必需。用来与正则表达式匹配的字符串
返参:
1.正则表达式与指定的字符串匹配 ,返回true。
2.不匹配,返回false
示例:
let str = 'hello world!';
let result = /^hello/.test(str);
console.log(result); // true
// 如果正则表达式设置了全局标志,test() 的执行会改变正则表达式 lastIndex 属性。
// 连续的执行test()方法,后续的执行将会从 lastIndex 处开始匹配字符串
var regex = /foo/g;
// regex.lastIndex is at 0
regex.test('foo'); // true
// regex.lastIndex is now at 3
regex.test('foo'); // false
支持正则的string的实例方法
search()
方法描述:用来检索与正则表达式相匹配的子字符串。
语法:
strObj.search(regObj)
参数:
strObj:必需。用来与正则表达
regObj: 必需。正则表达式。
返参:
1.有匹配,则返回第一个与 regexp 相匹配的子串的起始位置。
2.无匹配,返回 -1
说明:search() 方法不执行全局匹配,它将忽略标志 g。
示例:
let str = 'hello world!';
let result = str.search(/^hello/);
console.log(result); // 0
match()
方法描述:找到一个或多个正则表达式的匹配。
语法:
strObj.match(searchvalue)
strObj.match(regexp)
参数:
searchvalue:必需。要检索的字符串值
strObj:必需。用来与正则表达
regexp: 必需。正则表达式。
返参:
- regexp 没有全局标志 g ,match()方法只执行一次匹配。
a.无匹配,返回 null
b.有匹配,返回存放匹配结果的数组[val0,val1,val2,...,index,input] - regexp 有全局标志 g ,match()方法将执行全局检索,找到 stringObject 中的所有匹配子字符串。
a.无匹配,返回 null
b.有匹配,返回存放匹配结果的数组[val0,val1,val2,...]
示例:
let str = 'hello world!';
console.log(str.match("world")); // ["world", index: 6, input: "hello world!", groups: undefined]
console.log(str.match("worlld")); // null
let str1 ="1 plus 2 equal 3";
console.log(str1.match(/\d+/g)); // ["1", "2", "3"]
replace()
方法描述:用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
语法:
strObj.replace(regexp/substr,replacement)
参数:
strObj:必需。用来与正则表达
regexp/substr: 必需。规定子字符串或要替换的模式的 RegExp 对象
replacement:必需。规定了a.替换文本。或 b.生成替换文本的函数
返参:
一个新的字符串。用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的新字符串。
说明:如果 regexp 具有全局标志 g,那么 replace() 方法将替换所有匹配的子串。否则,它只替换第一个匹配子串。
示例:
var str = 'Twas the night before Xmas...';
var newstr = str.replace(/xmas/i, 'Christmas');
console.log(newstr); // Twas the night before Christmas...
let str1 ="1 plus 2 equal 3";
console.log(str1.match(/\d+/g)); // ["1", "2", "3"]
split()
方法描述:把一个字符串分割成字符串数组。
语法:
strObj.split(separator,howmany)
参数:
strObj:必需。用来与正则表达
separator: 必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。
howmany:可选。可指定返回的数组的最大长度,若设置此参数,返回的子串不会多于这个参数指定的数组。如果未设置,整个字符串都会被分割,不考虑它的长度。
返参:
一个字符串数组。通过在 separator 指定的边界处将字符串 stringObject 分割成子串创建的。
说明:
a.返回的数组中的字串不包括 separator 自身。
b.如果把空字符串 ("") 用作 separator,那么 stringObject 中的每个字符之间都会被分割。
示例:
let str = 'How are you';
console.log(str.split(' ')); // ["How", "are", "you"]
console.log(str.split('')); //["H", "o", "w", " ", "a", "r", "e", " ", "y", "o", "u"]
console.log("2:3:4:5".split(":")); //["2", "3", "4", "5"]
console.log("|a|b|c".split("|")); // ["", "a", "b", "c"]