zoukankan      html  css  js  c++  java
  • JavaScript RegExp 对象

    // 1 创建正则表达式两种方式
    // 1.1 用new
    // 第1个参数模式是必须的 第2个模式修饰符参数可选
    // i:忽略大小写 g:全局匹配 m:多行匹配
    var box = new RegExp('Box');
    var box = new RegExp('Box', 'gim');
    
    // 1.2 用字面量的形式
    // 两个反斜杠是正则表达式的字面量表示形成
    var box = /Box/;
    var box = /Box/gim;
    
    // 2 使用正则表达式两种方式
    // 2.1 test()
    /*
     * 只查找最多一个匹配,如果找到就立即返回true,否则返回false
     *
     * 如果为正则表达式设置了全局标志(g),test()函数仍然只查找最多一个匹配,
     * 不过我们再次调用该对象的test()函数将会从regExpObject.lastIndex索引位置处开始查找,从而找到下一个匹配。
     * 如果想要重新使用test()函数从头开始查找,则需要手动将regExpObject.lastIndex的值重置为 0。
     * 
     * regExpObject.lastIndex 本次匹配内容的最后一个字符的下一个索引位置。关闭全局 regExpObject.lastIndex 的值永远为 0。
     */
    var pen = /Pen/i;
    pen.test('pen'); // true
    pen.test('pencil'); // true
    pen.test('box'); // false
    
    var pattern = /google/g;
    var str = 'google google google';
    pattern.test(str); // true
    pattern.lastIndex; // 6
    pattern.test(str); // true
    pattern.lastIndex; // 13
    pattern.lastIndex = 0;
    pattern.test(str); // true
    pattern.lastIndex; // 6
    
    var pattern = /google/;
    var str = 'google google google';
    pattern.test(str); // true
    pattern.lastIndex; // 0
    
    // 2.2 exec()
    /*
     * 如果 exec() 找到了匹配的文本,则返回一个结果数组。
     * 此数组的第 0 个元素是与正则表达式相匹配的文本,
     * 第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),
     * 第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。
     * RegExpObject 的 lastIndex 属性为匹配文本的最后一个字符的下一个位置。
     *
     * 如果 exec() 找不到匹配的文本,返回 null。lastIndex 属性重置为 0。
     * 
     */
    var apple = /Apple/gi;
    apple.exec('apple'); // ["apple"]
    apple.exec('pineapple'); // ["apple"]
    apple.exec('apple and pineapple'); // ["apple"]
    apple.exec('pear'); // null
    
    var email = /(w+)@(w+).(w+)/g;
    email.exec("zhang@yeah.net and dan@qq.com"); // ["zhang@yeah.net", "zhang", "yeah", "net"]
    email.lastIndex; // 14
    email.exec("zhang@yeah.net and dan@qq.com"); // ["dan@qq.com", "dan", "qq", "com"]
    email.lastIndex; // 29
    email.exec("zhang@yeah.net and dan@qq.com"); // null
    email.lastIndex; // 0
    
    // 3 使用String对象的正则表达式四种方法
    // 3.1 match()
    var bus = /Bus/i;
    'bus'.match(bus); // ["bus"]
    'Buses'.match(bus); // ["Bus"]
    'This is a bus, it is my bus.'.match(bus); // ["bus"]
    'These are buses, they are our buses.'.match(/Bus/gi); // ["bus", "bus"]
    'car'.match(bus); // null
    
    // 3.2 search()
    var flower = /flower/ig;
    'flower'.search(flower); // 0
    'red flower and pink flower'.search(flower); // 4
    'tree'.search(flower); // -1
    
    // 3.3 replace(search, replacement)
    // search 为正则表达式时 replacement可以使用 $1、$2、...、$99、$&、$`、$'、$$ 变量来动态确定用于替换的字符串内容
    'stronger and stronger'.replace(/stronger/i, 'more'); // "more and stronger"
    'stronger and stronger'.replace(/stronger/ig, 'more'); // "more and more"
    'stronger and stronger'.replace(/and/, "$$"); // "stronger $ stronger"
    'baidu google'.replace(/(.*)s(.*)/, '$2 $1'); // "google baidu"
    
    // 3.4 split()
    var and = /And/i;
    'pen And pencil and rule'.split(and); // ["pen ", " pencil ", " rule"]
    'pen'.split(and); // ["pen"]
    'and pencil'.split(and); // ["", " pencil"]
    'pen and'.split(and); // ["pen ", ""]
    
    // 4 正则表达式静态属性
    // 所有静态属性只可读 匹配失败值不变 匹配成功值改变
    
    // 4.1 RegExp.$1 - RegExp.$9
    // 正则表达式是支持分组捕获的,最前面的9个匹配文本会依次存储在RegExp的静态属性$1-$9中。
    /(w)-(w)-(w)-(w)-(w)-(w)-(w)-(w)-(w)-(w)/.test('a-b-c-d-e-f-g-h-i-j-k-l-m-n-o'); // true
    RegExp.$1; // "a"
    RegExp['$1']; // "a"
    RegExp.$2;; // "b"
    RegExp['$2']; // "b"
    // ...
    RegExp.$9; // "i"
    RegExp['$9']; // "i"
    
    // 4.2 RegExp.input
    // 被匹配字符串 也可以表示成 RegExp['$_'] 或者 RegExp.$_
    /pen/.test("pen and pencil"); // true
    RegExp.input; // "pen and pencil"
    RegExp['$_']; // "pen and pencil"
    RegExp.$_; // "pen and pencil"
    
    // 4.3 RegExp.leftContext
    // 当前成功匹配文本之前的所有字符 也可以表示成 RegExp["$`"]
    var pen = /pen/g;
    pen.test("A pen and a pencil"); // true
    RegExp.leftContext; // "A "
    RegExp["$`"]; // "A "
    pen.test("A pen and a pencil"); // true
    RegExp.leftContext; // "A pen and a "
    RegExp["$`"]; // "A pen and a "
    
    // 4.4 RegExp.rightContext
    // 当前成功匹配文本之后的所有字符 也可以表示成 RegExp["$'"]
    var pen = /pen/g;
    pen.test("A pen and a pencil"); // true
    RegExp.rightContext; // " and a pencil"
    RegExp["$'"]; // " and a pencil"
    pen.test("A pen and a pencil"); // true
    RegExp.rightContext; // "cil"
    RegExp["$'"]; // "cil"
    
    // 4.5 RegExp.lastMatch
    // 最后匹配到的字符串 也可以表示成 RegExp['$&']
    var pen = /pen/g;
    pen.test("A pen and a pencil"); // true
    RegExp.lastMatch; // "pen"
    RegExp['$&']; // "pen"
    
    // 4.6 RegExp.lastParen
    // 最后带括号的子匹配 也可以表示成 RegExp["$+"]
    /(w)-(w)-(w)-(w)-(w)-(w)-(w)-(w)-(w)-(w)/.test('a-b-c-d-e-f-g-h-i-j-k-l-m-n-o'); // true
    RegExp.lastParen; // "j"
    RegExp["$+"]; // "j"
    
    // 5 正则表达式实例属性
    // 5.1 regExpObject.global
    // 正则表达式是否具有global标志
    /google/.global; // false
    /google/gim.global; // true
    
    // 5.2 regExpObject.ignoreCase
    // 正则表达式是否具有ignoreCase标志
    /google/.ignoreCase; // false
    /google/gim.ignoreCase; // true
    
    // 5.3 regExpObject.multiline
    // 正则表达式是否具有multiline标志
    // IE不支持multiline属性 很多的浏览器也不支持该属性
    /google/.multiline; // false
    /google/gim.multiline; // true
    
    // 5.4 regExpObject.source
    // 正则表达式模式的文本内容
    /google/.source; // "google"
    /google/gim.source; // "google"
    
    // 6 正则表达式模式
    // ^n 以 n 开头
    // n$ 以 n 结束
    
    // n* 零个或多个 n 
    var patter = /go*gle/;
    patter.test("ggle"); // true
    patter.test("gogle"); // true
    patter.test("google"); // true
    
    // n+ 至少一个 n 
    var patter = /go+gle/;
    patter.test("ggle"); // false
    patter.test("gogle"); // true
    patter.test("google"); // true
    
    // n? 零个或一个 n 
    var patter = /go?gle/;
    patter.test("ggle"); // true
    patter.test("gogle"); // true
    patter.test("google"); // false
    
    // n{X} X 个 n
    var patter = /go{2}gle/;
    patter.test("gogle"); // false
    patter.test("google"); // true
    patter.test("gooogle"); // false
    
    // n{X,} 至少 X 个 n
    var patter = /go{2,}gle/;
    patter.test("gogle"); // false
    patter.test("google"); // true
    patter.test("gooogle"); // true
    
    // n{X,Y} 至少 X 个 n,最多 Y 个 n。
    var patter = /go{2,3}gle/;
    patter.test("gogle"); // false
    patter.test("google"); // true
    patter.test("gooogle"); // true
    patter.test("goooogle"); // false
    
    // ? 紧跟在*,+,?,{n},{n,},{n,m})任何一个后面时,匹配模式是非贪婪的。
    // 非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。
    /[a-z]+/.exec('abcdef'); // ["abcdef"]
    /[a-z]+?/.exec('abcdef'); // ["a"]
    
    var greed = /[a-z]+/g;
    greed.exec('abcdef'); // ["abcdef"]
    greed.exec('abcdef'); // null
    var lazy = /[a-z]+?/g;
    lazy.exec('abcdef'); // ["a"]
    lazy.exec('abcdef'); // ["b"]
    lazy.exec('abcdef'); // ["c"]
    lazy.exec('abcdef'); // ["d"]
    lazy.exec('abcdef'); // ["e"]
    lazy.exec('abcdef'); // ["f"]
    lazy.exec('abcdef'); // null
    
    'abcdef'.replace(/[a-z]+/, '贪婪'); // "贪婪"
    'abcdef'.replace(/[a-z]+?/, '惰性'); // "惰性bcdef"
    
    'abcdef'.replace(/[a-z]+/g, '贪婪'); // "贪婪"
    'abcdef'.replace(/[a-z]+?/g, '惰性'); // "惰性惰性惰性惰性惰性惰性"
    
    /[a-z]{3,6}/.exec('abcdef'); // ["abcdef"]
    /[a-z]{3,6}?/.exec('abcdef'); // ["abc"]
    
    // . 一个任意字符,除了换行和行结束符。
    var patter = /g.gle/;
    patter.test("ggle"); // false
    patter.test("gogle"); // true
    patter.test("g2gle"); // true
    patter.test("google"); // false
    
    // (pattern) 捕获性分组 匹配pattern并获取这一匹配
    /(d+)([a-z]+)(d+)/.exec('123abc456'); // ["123abc456", "123", "abc", "456"]
    
    // (pattern(pattern)) 嵌套分组 从外往内捕获
    /(a?(b?(c?)))/.exec('abc'); // ["abc", "abc", "bc", "c"]
    
    // (?:pattern) 非捕获性分组 匹配pattern但不获取匹配结果
    /(d+)(?:[a-z]+)(d+)/.exec('123abc456'); // ["123abc456", "123", "456"]
    
    // (?=pattern) 正向肯定预查 非获取匹配
    var pattern = /goo(?=gle)/;
    pattern.exec('good'); // null
    pattern.exec('google'); // ["goo"]
    RegExp.$1; // ""
    
    var pattern = /pe(?=n)/g;
    var str = 'a pen and a pencil';
    pattern.exec(str); // ["pe"]
    pattern.lastIndex; // 4
    pattern.exec(str); // ["pe"]
    pattern.lastIndex; // 14
    pattern.exec(str); // null
    pattern.lastIndex; // 0
    
    // x|y 匹配x或y
    
    // [abc] 方括号之间的任何一个字符,方括号内的字符可以是任何字符或字符范围。
    var patter = /g[0-9a-zAB]gle/;
    patter.test("ggle"); // false
    patter.test("gogle"); // true
    patter.test("g2gle"); // true
    patter.test("gAgle"); // true
    patter.test("gBgle"); // true
    patter.test("google"); // false
    patter.test("gABgle"); // false
    
    // [A-Z] A-Z中的任意一个字符
    // [a-z] a-z中的任意一个字符
    // [A-z] A-z中的任意一个字符
    // [0-9] 0-9中的任意一个数字
    // [^abc] 不在方括号之间的任意一个字符
    var patter = /g[^12]gle/;
    patter.test("ggle"); // false
    patter.test("gogle"); // true
    patter.test("g2gle"); // false
    patter.test("google"); // false
    //  一个单词边界
    // B 一个单词非边界
    // d 一个数字
    // D 一个非数字
    // s 匹配任何空白字符,包括空格、制表符、换页符等等。
    // S 匹配任何非空白字符。
    // w 一个单词字符,包括:a-z、A-Z、0-9,以及下划线_ 。 // W 一个非单词字符

    正则表达式速查表 

  • 相关阅读:
    第一个springboot程序,初识springboot
    创建一个简单的springBoot项目的两种方式
    vue过程中遇到的Uncaught (in promise) TypeError: Cannot read property '$message' of undefined
    springboot redis的db动态切换没有作用
    docker redis chown: changing ownership of '.': Permission denied
    axios url携带参数问题(params与data的区别)
    docker安装mysql8.0并挂载到主机
    android与服务器的登录验证与安全设计
    团队冲刺10 5.11
    构建之法01
  • 原文地址:https://www.cnblogs.com/pumushan/p/6722785.html
Copyright © 2011-2022 走看看