正则表达式的那些事

201 阅读1分钟

一:常见的元字符(既拥有特殊含义的特定字符)

元字符描述
.匹配换行和结束符以外的所有字符
\w匹配字母,数字,下划线
\W匹配字母,数字,下划线
\d匹配数字
\D匹配数字
\s匹配空格
\S匹配空格
\b匹配单词边界
\B匹配单词边界
更多其它(www.runoob.com/regexp/rege…)

二:量词

量词描述
^匹配开头
$匹配结尾
*匹配零次或无限次
+匹配一次或无限次
匹配零次或一次
{x}匹配x次
{x,y}匹配最少x次最多y次
{x,}匹配最少x次最多无限次

三:贪婪性匹配

强,弱贪婪性

?,{n} , {n,m} 重复类具有弱贪婪性,表现为贪婪的有限性。

*,+ , {n,} 重复类具有强贪婪性,表现为贪婪的无限性。

const value = '<html><head><title></title></head><body></body></html>';
const reg = /(<.*>)(<.*>)/;
const result = value.match(reg);
console.log(result); /**  [
                           "<html><head><title></title></head><body></body></html>",
                           "<html><head><title></title></head><body></body>",
                           "</html>"
		] **/

几种常见弱贪婪性

匹配模式描述
{n,m}?至少只匹配n次,满足限定条件时最多匹配m次
{n}?匹配n次
{n,}?至少只匹配n次,满足限定条件时匹配任意次
??至少只匹配0次,满足限定条件时最多匹配1次
+?至少只匹配1次,满足限定条件时匹配任意次
*?至少匹配0次,满足限定条件时匹配任意次
const value = '<html><head><title></title></head><body></body></html>';
const reg = /(<.*?>)/;
const result = value.match(reg);
console.log(result); // ["<html>", "<html>"]

四:声名词量(表示须满足的条件)

声明形式条件语法描述
正向声名?=指定执行匹配必须满足右侧的条件
反向声名?!指定执行匹配不必满足右侧的条件
正向声名?<=指定执行匹配必须满足左侧的条件
反向声名?<!指定执行匹配不必满足左侧的条件
const value = 'a: 1; b: 2';
const reg1 = /.*(?=1)/; // 输出满足字符后面是1的字符
const reg2 = /.*(?!;)/; // 输出满足字符后面不是;字符
const result1 = value.match(reg1);
console.log(result1); // ['a: ']
const result2 = value.match(reg2);
console.log(result1); // ['a: 1; b: 2']

五:语法糖

方括号[ ]

用法详解:匹配[ ]内的其中一个字符内容

const value = 'abcd132567';
const reg1 = /[abd1-35-7]/g; // 匹配a,b,c,1,2,3,5,6,7任意一个字符满足即可
const reg2 = /[^abd1-35-7]/g; // [^]表示匹配不在括号内的字符
const result1 = value.match(reg1);
const result2 = value.match(reg2);
console.log(result1); // 输出结果为["a", "b", "d", "1", "3", "2", "5", "6", "7"]
console.log(result2); // 输出结果为["c"]

小括号( )

用法详解: 匹配( )内的整体字符内容

const value = 'abcd132567';
const reg = /(13)/g; // 整体匹配13字符
const result = value.match(reg);
console.log(result); // 输出结果为["13"]

或 |

用法详解:(a) | (b) 要么满足a或者要么满足b,一般情况下与小括号()连用避免歧义

const value = 'abcd132567';
const reg = /(13)|(25)/g; // 要么整体匹配13要么整体匹配25
const result = value.match(reg);
console.log(result); // 输出结果为["13", "25"]

六:反向引用

\n:其中n为大于等于1的正整数

const value = 'aaccdd';
const reg = /(\w)\1(\w)\2/; // \1表示等于第一个小括号的值,以此类推则\2表示第二个括号的值
const result = value.match(reg);
console.log(result); // 输出结果为["aacc", "aa", "cc"]

七:引用的赋值

const value = 'abcd';
const reg = /(\w)(\w)/;
value.relace(reg, '$2$1'); // 匹配并返回将第一个小括号匹配的项与第二个小括号匹配的项交换位置
console.log(value); // 输出结果为bacd
$&表示所有的()

八:禁止引用

反向引用会占用一定的系统资源,正则过长会降低匹配速度,若不希望存储无用信息,则可以使用'?:'来禁止引用

const value = 'aaccdd';
const reg = /(?:\w)\1(?:\w)\2/; // \1表示等于第一个小括号的值,以此类推则\2表示第二个括号的值
const result = value.match(reg);
console.log(result); // 输出结果为["aacc"]
// 与反向引用相比,少输出了"aa", "cc"两项,这里对应的是RegExp.$1, RegExp.$2
// 这里?:做了禁止储存操作RegExp.$1, RegExp.$2并没用存储下来