正则表达式感觉还是挺经常用到的,但是之前只是简单的看了一下文档,没有自己动手实践过如何写一个正则表达式,遇到代码也是一知半解,刚好这次复习时遇到很多正则的题目,就重新学一下
正则表达式是构成搜索模式的字符序列,该搜索模式可用于文本搜索和文本替换工作(摘自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) | 查找由|分割的任何选项 |
例如:
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 是第一个小括号对应的括号内的内容