一、符号含义集合
1.^
表行开头
2.$
表行结尾
3.[^5-9]
中括号中使用^
表排除,比如以上表达式表示除5-9以外的任意字符。
4..
英文中的句号,也就是一个点,使用来匹配任意字符的简便写法。
注:当元字符出现在小括号内时表示枚举。
[1-9.]
匹配1到9的数字或是一个.
。
5.|
或字符,表示或关系,比如(S|s)teven
6.?
表可选项,表允许出现这样的字符。出现一次或0次。
4(th)?
july?
7.+
表之前的元素出现一次或多次。
8.*
表之前的元素出现0次或多次。
符号 | 含义 |
---|---|
? | 出现0次或一次 |
+ | 出现一次或多次 |
* | 出现0次或多次 |
{5,9} | 量词,出现限定次数,这里指出现五次到九次 |
二、反向引用
使用\1
,\2
…这种引用方式匹配字符串中被括号引用的值。
- 比如:使用正则表达式
([0-9])\1
去匹配23-11--43-32
- 匹配结果为
11
- 因为反向引用的值必须与括号内实际的值相同
- 也就是说括号的值虽然可以从0到9多选,但是引用时这个值必须与括号内的值相同
三、匹配字符
1.\b
匹配一个字边界,即字与空格间的位置。
2.\D
匹配一个非字边界,等价于[^\b]
3.\d
等价于[0-9],能匹配所有的Unicode数字。
4.\D
非数字字符,等价于[^\d]。
5.\w
匹配所有单词中的字符。等价于[a-zA-Z0-9_]
6.\W
非单词字符,等价于[^\w]。
7.\s
匹配所有空白字符(不可见字符),等价于[·\f\n\r\t\v]
- \f 匹配一个换页符。等价于\x0c和\cL。
- \n 匹配一个换行符。等价于\x0a和\cJ。
- \r 匹配一个回车符。等价于\x0d和\cM。
- \t 匹配一个制表符。等价于\x09和\cI。
- \v 匹配一个垂直制表符。等价于\x0b和\cK。
8.\S
匹配所有非空白字符,等价于[^\s]
四、常用正则方法
0. RegExp 构造函数
用于创建一个正则表达式的构造函数。
(1)参数是字符串的正则构造写法
let regex = new RegExp('xyz', 'i');
// equals
let regex = /xyz/i;
(2)参数是正则表达式的正则构造写法
let regex = new RegExp(/xyz/i);
// equals
let regex = /xyz/i;
(3)重复定义修饰符会覆盖前边定义的修饰符
let regex = new RegExp(/abc/ig, 'i');
// equals
let regex = new RegExp(/abc/i);
1. match
用于检索字符串中是否包含指定的字符串。
基本格式:.match()
let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
let regexp = /[A-E]/gi;
let matches_array = str.match(regexp);
// ['A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e']
- 括号中可以是一个正则表达式也可以是一个字符串。
- 返回的结果可能为null、一个对象(匹配到一个结果)或是一个数组(匹配到多个结果)。
2. replace
用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
基本格式:<String>.replace(<RegExp>,<replacer>)
返回结果:被替换后的字符串。
let str='abc123!!!'.replace(/([^\d]*)(\d*)([^\w]*)/,$1$2$3+'222');
//"abc123!!!222"
//$1、$2、$3分别代表括号中匹配到的内容
变量名 | 代表的值 |
---|---|
9 | 对应括号中匹配到的第n个字符串 |
$$ | 插入一个 “$”。 |
$& | 插入匹配的子串。 |
$` | 插入当前匹配的子串左边的内容。 |
$’ | 插入当前匹配的子串右边的内容。 |
$n | 假如第一个参数是 RegExp对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串。 |
3.match
检测字符串中是否有匹配检到的结果,找到一个或多个正则表达式的匹配。
基本格式:
str.match(regexp)
返回值:匹配到的结果,可以是一个对象(匹配到的一个结果hu或是null),或是一个数组(匹配到的多个结果)。
let str="1 plus 2 equal 3"
str.match(/\d+/g); //1,2,3
str.match('equal'); //["equal", index: 9, input: "1 plus 2 equal 3", groups: undefined]
4.split
- 方法用于把一个字符串分割成字符串数组。
- split第一个参数为匹配的正则表达式(设置分割规则)。必填。
- split的第二个参数用于设置匹配到数组的长度。选填。
- 如果把空字符串 (“”)作为第一个参数,将会把字符串每个字符转换为数组中的一项。
- String.split() 执行的操作与 Array.join 执行的操作正好相反。
let str='interesting';
str.split();
//["interesting"]
str.split('');
//(11) ["i", "n", "t", "e", "r", "e", "s", "t", "i", "n", "g"]
str.split('',5);
//(5) ["i", "n", "t", "e", "r"]
str.split('e');
//(3) ["int", "r", "sting"]
str.split(/[tn]/gi);
//(5) ["i", "", "eres", "i", "g"]
5.exec
- 用于检索字符串中的正则表达式的匹配。
- 基本格式:
string.exec(regexp)
- 如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。
- 要匹配多个结果可使用循环,代码如下
let str = "interesting";
let patt = /e/g;
while ((result = patt.exec(str)) !== null) {
console.log(result);
}
// ["e", index: 3, input: "interesting", groups: undefined]
// ["e", index: 5, input: "interesting", groups: undefined]
使用圆括号进行组匹配。
const RE_DATE = /(\d{4})-(\d{2})-(\d{2})/;
const matchObj = RE_DATE.exec('1999-12-31');
const year = matchObj[1]; // 1999
const month = matchObj[2]; // 12
const day = matchObj[3]; // 31
flags与source
用于返回正则表达式的修饰符。
// ES5 的 source 属性
// 返回正则表达式的正文
console.log(/abc/ig.source);
// "abc"
// ES6 的 flags 属性
// 返回正则表达式的修饰符
console.log(/abc/ig.flags);
// 'gi'
五、断言
1.先行断言
x只有在y前面才匹配,必须写成/x(?=y)/。比如,只匹配百分号之前的数字,要写成/\d+(?=%)/。
- 检测
%
前边的数字。
/\d+(?=%)/.exec('100% of US presidents have been male') // ["100"]
2.先行否定断言
x只有不在y前面才匹配,必须写成/x(?!y)/。比如,只匹配不在百分号之前的数字,要写成/\d+(?!%)/。
- 检测前边不是
%
的数字
/\d+(?!%)/.exec('inter 5%') // null
3.后行断言
- x只有在y后面才匹配,必须写成/(?<=y)x/。
/(?<=\$)\d+/.exec('Benjamin Franklin is on the $100 bill') // ["100"]
4.后行否定断言
- x只有不在y后面才匹配,必须写成/(?
/(?<!\$)\d+/.exec('it’s is worth about €90') // ["90"]
/(?<!\$)\d+/.exec('it’s is worth about $9') // null