爱学习的好孩子

正则表达式

时间: 2024-06-11

元字符

元字符 描述
. 单个字符,除了换行
\w 单词字符
\W 非单词字符
\d 数字
\D 非数字字符
\s 空白字符
\S 非空白字符
\b 匹配单词边界
\B 匹配非单词边界
\0 NUL字符
\n 换行符
\f 换页符
\r 回车符
\t 制表符
\v 垂直制表符
\xxx 以八进制数 xxxx 规定的字符
\xdd 以十六进制数 dd 规定的字符
\uxxxx 以十六进制 xxxx规定的 Unicode 字符

表示字符的方法有多种,除了可以直接使用字符本身外,还可以使用 ASCII 编码或者 Unicode 编码来表示。

描述字符范围

在正则表达式语法中,方括号[]表示字符范围。

如果多个字符的编码顺序是连续的,可以仅指定开头和结尾字符,省略中间字符,仅使用连字符~表示。

如果在方括号内添加脱字符^前缀,还可以表示范围之外的字符。例如:

[abc]:查找方括号内任意一个字符。
[^abc]:查找不在方括号内的字符。
[0-9]:查找从 09 范围内的数字,即查找数字。
[a-z]:查找从小写 a 到小写 z 范围内的字符,即查找小写字母。
[A-Z]:查找从大写 A 到大写 Z 范围内的字符,即查找大写字母。
[A-z]:查找从大写 A 到小写 z 范围内的字符,即所有大小写的字母。

关于正则表达式中的分组

正则表达式的分组能够将子表达式做成子集,使用()进行分组,方便对match的字符串进行划分。

分组语法

语法 说明
(exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本

位置指定

语法 说明
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置

分组的实例

let str = "<xml><MsgId>1234567890123456</MsgId></xml>";
let patten = /<([\w-:.]+)/;
let matched = str.match(patten);
let pattenName = /<(?<tag>[\w-:.]+)/;
let matchedName = str.match(pattenName);

if (!matched || !matchedName) {
  throw new Error("fuck");
}

// undefined { tag: "xml" }
console.log(matched.groups, matchedName.groups);

关于 | 符号的使用

在编程中,||通常表示的关系。|在正则中也表示或的意思。

比如,我们要匹配以下情况: 是动物;是动物;是动物。

是动物三个字是必不可少的,但是前面的是限定词,那如何定义呢?

可以使用/(狗|猫|牛)是动物/这样的表示。

常用实例

含义 表达式
不包含某字符串 ^((?!name).)*$

附录

评论