new RegExp / / 正则
正则(RegExp)
定义:正确的规则 它是专门来操作(检:检查,索:搜索)(模糊范围的)字符串的一种规则。
简写: /规则和字符串(不带引号的字符串)/
比如:/d/
标准写法: new RegExp ( // || 带引号的字符串 , 修饰符 )
- 第一个参数:可以放字符串或者正则,注意:如果是字符串形式的元字符,记得要转意。
- 第二个参数:修饰符
- 一般是遇到 变量或者参数 的时候,用标准写法。
正则表达式是由 多种元字符 与 运算符 组成的。
1. 元字符
1.1 普通字符
例如:
小写字符 a 到 z
大写字符 A 到 Z
数字 0 到 9
符号
1.2 特殊字符
字符 | 描述 |
---|---|
\cx | 匹配由x指明的控制字符。例如, \cM 匹配一个 Control - M 或回车符。x 的值必须为 A - Z 或 a - z 之一。否则,将 c 视为一个原义的 'c' 字符。 |
\f | 匹配一个换页符。等价于 \x0c 和 \cL。 |
\n | 匹配一个换行符。等价于 \x0a 和 \cJ。 |
\r | 匹配一个回车符。等价于 \x0d 和 \cM。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。 |
\S | 匹配任何非空白字符。等价于[^ \f\n\r\t\v]。 |
\t | 匹配一个制表符。等价于 \x09 和 \cI。 |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK。 |
\s | 匹配任何不可见字符(空白符),包括:空格、制表符、换页符等等 |
\S | 匹配任何可见字符(非空白符)。不包括换行。 |
.点 | 匹配除\n 和\r 之外的任何单个字符。相等于 [^\n\r] |
\d | 匹配0-9之间的任意一个数字 |
\D | 除了0-9之间的任意字符 |
\w | 匹配数字、字母、下划线,中的任意一个字符,相等于 [0-9a-zA-Z] |
\W | 除了数字,字母,下划线以外的任意字符 |
\b | 匹配一个边界 ‘box tag’ (文字是没有边界的,比如:你好,中文的感叹号!。) |
\B | 除了边界以外的其他字符 |
\num | 重复子项: \1就代表重复第一个子项(只重复一次)。如果有第二个()子项,那么\2就代表重复第二个子项,以此类推。 |
2. 运算符
正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。
相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:
运算符 | 描述 |
---|---|
\ |
转义符 |
(), (?:), (?=), [] |
圆括号和方括号 |
*, +, ?, {n}, {n,}, {n,m} |
限定符 |
^, $, \任何元字符、任何字符 |
定位点和序列(即:位置和顺序) |
` | ` |
2.1 转义符
\
可以带任意的符号,只不过有些符号是有特殊含义的
2.2 限定符:
字符 | 描述 |
---|---|
{} | 量词的范围,例如:{n,m} 最小是n,最大是m,(n,m都是一个非负整数) |
+ | 号代表前面的字符必须至少出现一次(1次或多次)。 等效于 {1,} |
? | 号代表前面的字符出现(0次、或1次)。 等效于 {0,1} |
* | 号代表前面的字符出现任意次(0次、或1次、或多次)。等效于 {0,} |
2.3 修饰符:
字符 | 描述 |
---|---|
g | global 全局匹配(找整个字符串) |
i | ignoreCase=>忽略大小写 |
m | multiline=> 多行匹配 一般是配合\n 来使用的 |
s | 默认情况下的圆点 . 是 匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n。 |
^ | 从字符串开头进行匹配 |
$ | 从字符串末尾进行匹配 |
[ ] | 范围,任意取其一,范围是遵循ascll码走的。例:\w => [0-9a-zA-Z] 的范围,中文的范围:[ \u4e00 - \u9fa5 ] (记忆:有事100,有酒罚我) |
[^] | 排除 |
() | 将( 和 ) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。 |
(pattern) |
匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '(' 或 ')'。 |
(?:pattern) |
匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 `( |
(?=pattern) |
正向肯定预查(look ahead positive assert),在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,`"Windows(?=95 |
(?!pattern) |
正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如`"Windows(?!95 |
(?<=pattern) |
反向(look behind)肯定预查,与正向肯定预查类似,只是方向相反。例如,`"(?<=95 |
(?<!pattern) |
反向否定预查,与正向否定预查类似,只是方向相反。例如`"(?<!95 |
` | ` |
3. 正则的方法:
//.test(字符串)
,字符串中有没有正则能匹配到的内容,返回值: true false
//.exec(字符串)
,方法用于检索字符串中的正则表达式的匹配,返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
4. 字符串中与正则有关的方法:
str.match(//)
,把匹配到的字符放入到数组中,不匹配返回null
str.replace( " " | / /(要替换谁)," " | callback(替换成什么))
,callback 回调函数的特性:每匹配到一次就,调用一次函数
4.1 替换字符串默认的callback参数
第一个参数:匹配到的字符
第二个参数:索引
第三个参数:整个字符串
第四个参数开始往后都是:undefined
4.2 如果有() 子项、分组
第一个参数:匹配到的字符
第二个参数之后:对应每一个 子项|分组。
分组或者子项之后是:索引、整个字符串、undefined
举例:找到字符串中哪个字母出现的次数最多,出现了几次?
let str = 'dnsasudhusadssasdgsjdgddsjsddhaslfdiusadlhsdsfudahsful';
let n = -Infinity; //负无穷大
let name = '';
let str2 = str.split('').sort().join('');
str2.replace(/([a-z])\1+/g,function($0,$1){ // $0=>本次匹配的字符,$1=>第一个分组
if(n < $0.length){
n = $0.length;
name = $1;
}
});
console.log(n,name);
上面的例子中,括号,表示一个分组,\1+ 表示重复上面分组里的内容一次或多次
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步