js正则表达式知识点总结

240 阅读2分钟

正则总结:

概念:

  • ide查找/替换,js中使用

  • 按照规则匹配符合条件的字符串

find ./ -name *.txt

  • 图形工具:

regexper.com

修饰符

  • g/i/m 修饰符:全局搜索,忽略大小写,多行搜索

元字符

  • 原义文本字符

  • 元字符

    有特殊含义的非字母字符

    * + ? $ ^ . | \ () {} [] 
    
    字符含义
    /t水平制表符
    /v垂直制表符
    /n换行符
    /r回车符
    /0空字符
    /f换页符
    /cX与X对应的控制字符(ctrl+X)

[ ] 归类,

有其中 一个就行

^ 反向类/负向类,不属于某类

[^abc] 表示不属于a或b或c的内容

范围类

  • [a-z] 闭区间,a到z

    [a-zA-Z]

    [0-9-] 包括横线

'2016-12-12'.replace(/[0-9-]/g,'a')

'aaaaaaaaaa'

预定义类

字符等价类含义
.[^\r\n]除了回车符和换行符之外的所有字符
\d[0-9]数字字符
\D[^0-9]非数字字符
\s[\t\n\x0B\f\r]空白符
\S[^\t\n\x0B\f\r]非空白符
\w[a-zA-Z_0-9]单词字符(字母、数字下划线)
\W[^a-zA-Z_0-9]非单词字符

边界

字符含义
^以xxx开始(不是在中括号里面就不是取反了)
$以xxx结束
\b单词边界
\B非单词边界
  • m修饰符的应用:
const aa = 
“@123
@456
@789
“
aa.replace(/^@\d/gm,'x')
“x123
x456
x789
“

量词

字符含义
?出现零次或一次(最多出现一次)
+出现一次或多次(至少出现一次)
*出现零次或多次(任意次)
{n}出现n次
{n,m}出现n到m次
{n,}至少出现n次
  1. 贪婪模式(默认)

    \d{3,6}
    
    1234567
    
    // 尽可能多的匹配
    
    

// 把前面123456个都匹配了



2. 非贪婪模式,尽可能少的匹配

在量词后加?即可

```js
\d{3,6}?

1234567

// 尽可能少的匹配

// 把123,456匹配了

分组

  • 加()即可

    就是整个匹配

'a1b2c3d4'.replace(/([a-z]\d){3}/g,'x')
'xd4'

或 |

  • 注意第二例子结合了分组
'ByronCasper'.replace(/Byron|Casper/g,'x')
'xx'
'ByronsperByrCasper'.replace(/Byr(on|Ca)sper/g,'x')
'xx'

反向引用

  • 1,1,2...引用分组
'2016-11-25'.replace(/(\d{4})-(\d{2})-(\d{2})/,'$2/$3/$1')

'11/25/2016'

分组捕获
  • 忽略分组

    不希望捕获某个分组,就在该分组内加 ?: 即可

    (?:byron).(ok)
    

前瞻

  • 正则从头像尾解析,文本尾部称为前

    前瞻即向前检查是否符合断言

js不支持后顾

  • 符合和不符合特定断言称为肯定/正向匹配和否定/负向匹配
名称正则含义
正向前瞻exp(?=assert)
负向前瞻exp(?!assert)
正向后顾exp(?<=assert)js不支持
负向后顾exp(?<!assert)js不支持
'a2*34vv'.replace(/\w(?=\d)/g,'x')
'x2*x4vv'

'a2*34vv'.replace(/\w(?!\d)/g,'x')
'ax*3xxx'

正则对象的属性

  • global:全局搜索,默认false

  • ignoreCase:大小写敏感,默认false

  • multiline:多行搜索,默认false

  • lastIndex:当前表达式匹配内容最后一个字符的下一个位置

  • source:正则文本字符串

正则表达式本身的方法:

  • test(str)方法

    用于测试字符串参数中是否存在匹配正则表达式模式的字符串,存在返回true,不存在返回false

    注意g修饰符的区别

    var reg1 = /\w/;
    var reg2 = /\w/g;
    
    while(reg2.test('ab')){
          console.log(reg2.lastIndex)
    }
    // 1
    // 2
    
  • exec(str)方法

    使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性以反映匹配结果

    如果没有匹配的文本则返回null,否则返回一个结果数组

    • index声明匹配文本的第一个字符的位置

    • input 存放被检索的字符串string

    • 调用非全局的RegExp对象的exec()时,返回结果数组

      第一个元素是与正则相匹配的文本

      第二个是第一个子表达式相匹配的文本

      以此类推

      全局调用注意g标志

    var reg = /\d(\w)(\w)\d/;
    var ts = '$1az2bb3cy4dd5ee'
    var ret = reg.exec(ts)
    console.log(reg.lastIndex + '\t' + ret.index + '\t' + ret.toString());
    
    console.log(reg.lastIndex + '\t' + ret.index + '\t' + ret.toString());
    // "0 1 1az2,a,z"
    
    var reg1 = /\d(\w)(\w)\d/g;
    while(ret = reg1.exec(ts)){
    	console.log(reg1.lastIndex + '\t' + 	ret.index + '\t' + ret.toString());
    }
    // "5 1 1az2,a,z"
    // "11 7 3cy4,c,y"
    

字符串的方法

  • search(str/reg)方法

    • 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串
    • 返回第一个结果的index,找不到返回-1
    • 不执行全局匹配,忽略g,总是从开头进行检索
  • match() 方法

    • 检索字符串,找到一个或多个与regexp匹配的文本

      regexp是否有g,有很大影响

    • 非全局调用

      • 只匹配一次

      • 没找到任何文本,返回null

      • 否则将返回一个数组

        • 第一个元素是匹配的文本,其余是子表达式匹配的文本

        • 包含两个对象属性

          • index声明匹配字符串在字符串的位置

          • input声明对stringObject的引用

          非全局调用与exec相同

    • 全局调用时

      • 只返回结果。没有分组信息,index,lastIndex等
  • split()方法

    参数也可以是正则

  • replace()

    • 第一参数找谁,第二个参数是替换成谁

      str.replace(str,replaceStr)
      
      str.replace(reg,replaceStr)
      
      str.replace(reg,function)
      
    • function 参数

      • 匹配字符串
      • 分组内容,没有则无此参数
      • 匹配项在字符串中的index
      • 原字符串