正则表达式

166 阅读5分钟

正则表达式感觉还是挺经常用到的,但是之前只是简单的看了一下文档,没有自己动手实践过如何写一个正则表达式,遇到代码也是一知半解,刚好这次复习时遇到很多正则的题目,就重新学一下

正则表达式是构成搜索模式的字符序列,该搜索模式可用于文本搜索和文本替换工作(摘自w3c)

基本语法:

/pattern/modifiers; 其中,pattern是用来匹配的模式,modifiers是修饰符,常见的修饰符有以下三种:

  • i:执行对大小写不敏感的匹配
  • g:执行全局匹配(查找所有匹配而非在找到第一个匹配后就结束)
  • m:执行多行匹配
  • u:es6新增,含义为‘Unicode模式’,用来正确处理大于\uFFFF的Unicode字符
  • y:es6新增,(粘连sticky)修饰符,作用与g修饰符类似,也是全局匹配,不同之处在于,g修饰符只要剩余位置中存在匹配即可,而y修饰符确保匹配必须从剩余的第一个位置开始。(即y修饰符隐含了模式头部匹配标志^)

正则表达式模式

括号用于查找一定范围内的字符串:

表达式描述
[abc]查找方括号之间的任何字符
[^abc]查找任何不在方括号之间的字符
[0-9]查找任何从0至9的数字
[^0-9]查找任何不在括号内的字符(任何非数字)
(x|y)查找由|分割的任何选项

image.png

例如:

let s1='Hello world123456!';
var part1=/[ho]/g;
var part2=/[ho]/ig;
var part3=/[2-5]/g;//注意,如果这里没有加g,则只匹配到第一个匹配的数字2
let result1=s1.match(part1);
let result2=s1.match(part2);
let result3=s1.match(part3);
console.log(result1);//o,o
console.log(result2);//H,o,o
console.log(result3);//2,3,4,5

元字符 是拥有特殊含义的字符:

元字符描述
\d查找数字
\D查找非数字
\s查找空白字符
\S查找任何非空白字符
\w查找字母、数字、下划线
\W查找非字母、数字、下划线
\b匹配单词边界
\uxxx查找以十六进制数xxxx规定的Unicode字符
.表示非换行的任意字符
let s1='goodbye world 12345 world';
let p1=/\d/g;
let p2=/\s/g;
let p3=/\bworld/g;
console.log(s1.match(p1);//1,2,3,4,5
console.log(s1.match(p2);//['','','']
console.log(s1.match(p3);//world,world

let str = "Hello World!"; 
let patt1 = /\u0057/g;//0057是W的十六进制
console.log(str.match(patt1));//W

定义量词

量词描述
n+匹配任何包含至少一次n的字符串
n*匹配任何包含零个或多个n的字符串
n?匹配任何包含零个或一个n的字符串
let s1='Hellooo World!';
let p1=/o+/g;
console.log(s1.match(p1));//ooo,o

let s2='Helllooo World';
let p2=/lo*/g;//这里是以全局搜索'l',后面跟0个或多个'o'
console.log(s2.match(p2));//l,l,looo,l

let s3='1,100,1000'
let p3=/10?/g;//全局搜索1,后面跟0个或1个0
console.log(s3.match(p3));//1,10,10

正则表达式搜索方法

text.match(pattern)

返回包含匹配项的数组,如果未找到匹配项,则返回null

let text='I love sleep,sheep';
text.match(/eep/g);//eep,eep

text.search(regexp)

返回第一个匹配项的索引(位置),如果未找到匹配项,则返回-1

与match()区别:match()方法返回匹配数组,search()方法返回第一个匹配的位置

注意:该方法不执行全局匹配,会忽略标志g,所以它总是返回string的第一个匹配的位置

regexp.exec(text)

如果找到匹配项,则返回结果数组,如果没有找到匹配,则返回null

如果exec()找到了匹配的文本,就会返回一个结果数组,这个数组的第0个元素就是与表达式匹配的文本,第1个元素是与regexp的第一个子表达式相匹配的文本(如果存在),第2个元素是与第二个子表达式相匹配的文本,以此类推。

regexp.test(string)

测试字符串中的匹配项,如果找到匹配项则返回true,否则返回false

let text='hello world';
let p1=/hello/g;
console.log(p1.test(text));//true

2023.11.14补充

点字符

点(.)字符在正则表达式中,含义是除了换行符以外的任意单一字符,对于码点大于0xFFFF的Unicode字符,点字符不能识别,必须加上u修饰符

预定义模式

\S 是预定义模式,匹配所有非空白字符

后行断言

JavaScript语言的正则表达式只支持先行断言喝先行否定断言,不支持后行断言喝后行否定断言,ES2018引入后行断言,V8引擎4.9版已经支持。 先行断言

x只有在y前面才匹配,必须写成/x(?=y)/ ,x只有不在y前面才匹配,必须写成/x(?!y)/ 例如匹配数字:

/\d+(?=%)/.exec('100%');//["100"]
.\d+(?!%)/.exec('100%');//["10"]

后行断言

x只有在y后面才匹配,必须写成/(?<=y)x/ ,x只有不在y后面才匹配,必须写成/(?<!y)x/ ,例如,如果只匹配美元符号后面的数字,写成:/(?<=\$)\d+/ 只匹配不在美元符号后面的数字,写成/(?<!\$)\d+/

\1 是第一个小括号对应的括号内的内容

参考:JavaScript 正则表达式 (w3school.com.cn)