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

    JavaScript通过内置对象RegExp支持正则表达式
    有两种方法实例化RegExp对象---字面量和构造函数
    字面量:replace方法
    var reg = /is/g;
    or:构造函数
    var reg = new RegExp(/is/,'g');
    'he is a boy. This is a dog.Where is she?'.replace(reg,'Is')

    修饰符
    g:global全文搜索,不添加,搜索到第一个匹配停止 (默认false)
    i:ignore case 忽略大小写,默认大小写敏感(默认fals)
    m:multiple lines多行搜索(默认fals)
    l:lastIndex是当前表达式匹配内容的最后一个字符的下一个位置
    s:source正则表达式的文本字符串

    元字符--特殊含义
    ---水平制表符tab
    v---垂直制表符
    ---换行符
    ---回车符
    ---空字符
    f---换页符
    c[XZ]--与X对应的控制字符(Ctrl+X) (Ctrl+Z)

    字符类
    []构建一个类[abc]把字符a或b或c归为一类,表达式可以匹配这类的字符
    'a1b2c3d4'.replace(/[abc]/g,'x')---x1x2x3d4
    字符类取反 ^ 不属于某类的内容
    [^abc]表示不是字符a或b或c的内容
    'a1b2c3d4'.replace(/[^abc]/g,'x')---axbxcxxx

    范围类
    [a-z]---a到z的任意字符
    'a1b2c3d4A'.replace(/[a-zA-Z]/g,'A')---A1A2A3A4A

    预定义类
    .---[^ ] 除了回车符和换行符之外的所有字符
    d--[0-9] 数字字符
    D--[^0-9] 非数字字符
    s--[ x0Bf ] 空白符
    S--[^ x0Bf ]非空白符
    w--[a-zA-Z_0-9] 单词字符(字母,数字,下划线)
    W--[^a-zA-Z_0-9] 非单词字符
    边界
    ^---以xxx开始
    $---以xxx借宿
    --单词边界
    B--非单词边界

    前瞻
    exp(?=assert)--正向前瞻
    exp(?!assert)--负向前瞻
    exp(?<=assert)-正向后顾 JavaScript不支持
    exp(?<!assert)-负向后顾 JavaScript不支持
    'a2*3'.replace(/w(?=d)/g,'X')---X2*3 单词数字

    量词
    ?----最多一次
    +----至少一次
    *----任意次
    {n}--出现n次
    {n,m}出现n到m次
    {n,}-至少出现n次

    贪婪模式
    '12345678'.replace(/d{3,6}/g,'X')----X78 尽可能多的匹配
    '12345678'.replace(/d{3,6}?/g,'X')----X78 尽可能少的匹配,加个问号

    分组用()
    'a1b2c3d4'.replace(/([a-z]d){3}/g,'X')---Xd4
    'ByronsperByCasper'.replace(/Byr(on|Ca/)sper/g,'X') ---XX
    忽略分组 ?:
    (?:Byron).(ok)---ok是$1,Byron忽略了

    反向引用
    '2015-12-25'.replace(/(d{4})-(d{2})-(d{2})/g,'$1/$2/$3')--12/25/2015
    分组后:2015为$1 12为$2 25为$3

    test和exec
    RegExp.prototype.test(str)
    用于测试字符串参数中是否存在匹配正则表达式模式的字符串
    是返回true否返回false
    var reg1 = /w/;
    var reg2 = /w/g;
    reg1.test(ab); true
    reg2.test(ab); true/false 因为第一个b是单词,第二个不是单词
    while(reg2.test('ab')){
    console.log(reg2.lastIndex);//1, 2
    }

    RegExp.prototype.exec(str)
    使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性以反映匹配结果
    没有返回null,否则返回一个结果数组
    index声明匹配文本的第一个字符的位置
    input存放被检索的字符串string

    var reg3 = /d(w)(w)/d/;
    var reg4 = /d(w)(w)/d/g; //g表示全局搜索
    var ts = '$1az2bb3cy4dd5ee';
    var ret = reg3.exec(ts);
    console.log(reg3.lastIndex + ' ' + ret.index + ' ' + ret.toString());
    //"0 1 1az2,a,z"后面是分组的内容
    非全局下lastIndex不生效
    console.log(reg3.lastIndex + ' ' + ret.index + ' ' + ret.toString());

    while(ret = reg4.exec(ts))
    {
    console.log(reg4.lastIndex + ' ' + ret.index + ' ' + ret.toString());
    //"5 1 1az2,a,z"
    //"11 7 3cy4,c,y"
    }

    String.protatype.search(reg)
    search()方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串
    方法返回第一个匹配结果,查找不到返回-1
    search()方法不执行全局匹配,它忽略标志g,并且总是从字符串开始进行检索
    'a1b2c3d1'.search('1') //1数字也可以,尝试转成正则
    'a1b2c3d1'.search('10') //-1
    'a1b2c3d1'.search(/1/g) //1
    'a1b2c3d1'.search(/1/) //1

    String.protatype.match(reg)
    match()方法将检索字符串,找到一个或多个与regExp匹配的文本
    g标志对结果有影响
    非全局调用下,只进行一次匹配,返回数组的第一个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本
    除了常规元素外,返回的数组还含有2个对象属性
    index声明匹配文本的起始字符在字符串的位置
    input声明对stringObject的引用
    全局调用下没有index和input 属性
    var reg3 = /d(w)d/;
    var reg4 = /d(w)d/g;
    var ts = '$1a2b3c4d5e';

    var ret = ts.match(reg3);
    console.log(ret);//["1a2",'a']
    console.log(ret.index + ' ' + reg3.lastIndex);//"1 0"

    ret = ts.match(reg4);
    console.log(ret);//["1a2","3c4"]
    console.log(ret.index + ' '+ reg4.lastIndex);//"undefined 0"

    String.prototype.split(reg)
    把字符串分割成字符数组
    'a,b,c,d'.split(','); //["a","b","c","d"]
    'a1b2c3d'.split(/d/); //["a","b","c","d"]

    String.protatype.replace(str,replaceStr)
    String.protatype.replace(reg,replaceStr)
    String.protatype.replace(reg,function)
    function会在每次匹配替换的时候调用,有四个参数
    1.匹配字符串
    2.正则表达式分组内容,没有分组则没有该参数
    3.匹配项在字符串中的index
    4.原字符串
    eg1:
    'a1b2c3d4e5'.replace(/d/g, function(match, index, origin){
    console.log(index);
    return parseInt(match)+1;
    }); ---1 3 5 7 9 "a2b3c4d5e6"
    eg2:
    'a1b2c3d4e5'.replace(/(d)(w)(d)/g, function(match, group1, group2,group3, index, origin){
    console.log(match);
    return group1+group2;
    }); ---1b2 3d4 "a1bc3de5"
    'a1b1'.replace('1',2) ---"a2b1"
    'a1b1v1'.replace(/1/g,2) ---"a2b2v2"

  • 相关阅读:
    c# applibrary实现一个Sheet表中存放多张DataTable数据
    c#实现远程操作svn
    bat中rar压缩命令
    GitHub的使用之新建与更新代码
    工作笔记3
    jstat查看JVM GC情况
    sentinel 控制台接入
    Spring注解方式配置Redis
    mysql,utf8,utf8mb4
    Dubbo启动过程(Spring方式)详解
  • 原文地址:https://www.cnblogs.com/luomi/p/6075425.html
Copyright © 2011-2022 走看看