zoukankan      html  css  js  c++  java
  • JavaScript正则表达式小记

    RegExp.html

    前言

    本文主要为笔者在学习JavaScript正则过程中的一点学习笔记,主要讲述JavaScript的正则表达式及其相关,包含String的match、replace、search和split方法。

    创建正则

    • 字面量方式:var reg = /abc/;
      脚本加载后编译,性能更好
    • RegExp对象的构造函数 var reg = new RegExp("abc");

    特殊字符

    字符 含义
    ^ 匹配字符串的开始。如果多行标示被设为true,同时匹配换行后紧跟的字符
    $ 匹配字符串的结尾。如果多行标示被设为true,同时匹配换行前紧跟的字符
    * 匹配前一个字符0次或者是多次
    + 匹配前一个字符1次或者多次,等同于{1,}
    ? 匹配前一个字符0次或者1次,等同于{0,1}
    . 匹配任何除了新一行开头字符的任何单个字符 /.n/将会匹配”an apple is on the tree”中的“an”和“on”,不匹配“nay”
    (x) 匹配‘x’并且记住匹配项,即捕获分组.匹配到子字符串可以通过结果数组的[1],…,[n]进行访问
    (?:x) 匹配‘x’但是不记住匹配项,即非捕获分组.匹配到子字符串不能通过结果数组的[1],…,[n]进行访问,性能略高
    x(?=y) 匹配‘x’仅仅当‘x’后面跟着‘y’,但是不记住‘y’。正向肯定查找,非捕获分组的一种
    x(?!y) 匹配‘x’仅仅当‘x’后面不跟着‘y’,不记住‘y’。正向否定查找,非捕获分组的一种
    x|y 匹配‘x’或‘y’
    {n} n是正整数,匹配前面一个字符刚好发生了n次
    {n,m} n,m都是正整数。匹配前面的字符至少n次,最多m次。如果n或者m的值是0,这个值被忽略
    [xyz] 匹配方括号中的任意字符。可以使用破折号(-)来指定一个字符范围。
    [^xyz] 匹配任何没有包含在括号中的字符,可以使用破折号指定一个字符范围
    [] 匹配一个退格(U+008)
     匹配一个单词的边界
    B 匹配一个非单词边界
    d 匹配一个数字
    D 匹配一个非数字字符
    s 匹配一个空白字符,包括空格、制表符、换页符和换行符
    S 匹配一个非空白字符
    匹配一个水平制表符
    v 匹配一个垂直制表符
    w 匹配一个单字字符
    W 匹配一个非单子字符
    匹配一个换行符
    f 匹配一个换页符
    匹配一个回车符
    um num 是一个正整数,返回引用到捕获分组的副字符串。 eg/w+(,)?w+(!)?w+1w+2/匹配"beijing,the!capital,of!china"
    标志值
    g 全局搜索(global)
    m 多行搜索(multiline)
    i 不区分大小写(ignoreCase)

    RegExp方法

    • exec(string)
      返回一个数组。eg:

      var myRe = new RegExp("d(b+)d", "g"),
      var myArray = myRe.exec("cdbbbdc");
      
      属性或索引 描述 例子中对应的值
      myArray 匹配到的字符串和所有被捕获的子字符串 [“dbbbd”, ‘bbb’]
      [0] 匹配的所有字符串 ‘dbbdd’
      index 匹配到的字符串开始的索引值(以0开始) 1
      input 输入的初始字符串 “cdbbbdc”
      myRe
      lastIndex 下一次匹配开始的索引值(只有g参数时才有用) 5
      source 模式文本 “d(+)d”
    • test(string)
      return true/false
      查询字符串里是否有该正则的匹配

    String方法

    • match(RegExp)

      1. 如果正则表达式中没有g标志,返回和RegExp.match(string)相同的结果。且返回的数组同时拥有input和index属性
      2. 如果正则表达式包含g标志,则返回一个包含所有匹配结果的数组(无input和index属性)。没有匹配到,则返回null
    • split(RegExp)
      通过把字符串分割成子字符串来把一个string对象分割成一个字符串数组

    • search(RegExp)
      查看字符串对象与一个正则表达式是否匹配,返回正则表达式在字符串中首次匹配项的索引。否则,返回-1
      ps:如果传入一个非正则表达式对象,则会使用new RegExp(obj)隐式地将其装换为正则表达式对象。

    • replace(RegExp, replace|function)
      使用replacement替换string中匹配的RegExp,返回替换后的字符串,不该表原字符串。
      替换字符串可以插入下面的特殊变量名:

      变量名 代表的值
      $ 插入一个”$”
      @@bodyamp; 插入匹配的字符串
      @@title 插入当前匹配的字符串左边的内容
      $’ 插入当前匹配的字符串右边的内容
      $n or $nn n或nn是十进制的数字,那么插入第n个括号匹配的字符串

      指定一个函数作为参数
      这种情况下,当匹配执行后,该函数就会执行,函数的返回值作为替换字符串(上面的特殊参数在这里不能使用)。如果正则表达式是全局匹配模式,则该function将被多次调用,每次匹配都会被调用。
      该函数的参数:

      变量名 代表的值
      match 匹配的字符串(对应上面的@@bodyamp;)
      p1,p2,…,pn 代表RegExp对象中第n个括号匹配的字符串(对应于上述的$1,$2…)
      offset 匹配到的子字符串在原字符串中的偏移量。
      string 被匹配的原字符串

    几个简单小DEMO

    下面使用上面刚叙述过的正则表达式来练习下

    • DEMO1:
      将给定的任意一串阿拉伯数字例如:123456789 返回用逗号分割的结果123,456,789
       function test1(str) {
           return str.replace(/B(?=(?:d{3})+$)/g, ',');
       }
      
    • DEMO2:
      随机给定的一串字符,将该字符串里面的所有的阿拉伯数字均增长2倍,然后返回该字符串
       function test2(str) {
           str.replace(/d/g, function(val) {
               return val * 2;
           });
       }
      
  • 相关阅读:
    字符串 CSV解析 表格 逗号分隔值 通讯录 电话簿 MD
    Context Application 使用总结 MD
    RxJava RxPermissions 动态权限 简介 原理 案例 MD
    Luban 鲁班 图片压缩 MD
    FileProvider N 7.0 升级 安装APK 选择文件 拍照 临时权限 MD
    组件化 得到 DDComponent JIMU 模块 插件 MD
    gradlew 命令行 build 调试 构建错误 Manifest merger failed MD
    protobuf Protocol Buffers 简介 案例 MD
    ORM数据库框架 SQLite 常用数据库框架比较 MD
    [工具配置]requirejs 多页面,多入口js文件打包总结
  • 原文地址:https://www.cnblogs.com/qingguo/p/5253954.html
Copyright © 2011-2022 走看看