js正则表达式

什么是正则?

正则怎么使用?
推荐视频:js 正则表达式

一、 定义正则:
    我简单说正则即使我们想要定义的规则
    如:定义 input 输入框中的输入格式

二、正则的字符、字符集、量词等:

    

    

    2.2 几种反义:

       写法很简单改成大写就行了,意思与原来的相反,这里就不举例子了

       "\W"   匹配任意不是字母,数字,下划线 的字符

        "\S"   匹配任意不是空白符的字符

        "\D"  匹配任意非数字的字符

        "\B"  匹配不是单词开头或结束的位置

        "[^abc]"  匹配除了abc以外的任意字符

    2.3 量词:

       贪婪(贪心) 如"*"字符 贪婪量词会首先匹配整个字符串,尝试匹配时,它会选定尽可能多的内容,如果 失败则回退一个字符,然后再次尝试回退的过程就叫做回溯,它会每次回退一个字符,直到找到匹配的内容或者没有字符可以回退。相比下面两种贪婪量词对资源的消耗是最大的,

       懒惰(勉强) 如 "?"  懒惰量词使用另一种方式匹配,它从目标的起始位置开始尝试匹配,每次检查一个字符,并寻找它要匹配的内容,如此循环直到字符结尾处。

       占有  如"+" 占有量词会覆盖事个目标字符串,然后尝试寻找匹配内容 ,但它只尝试一次,不会回溯,就好比先抓一把石头,然后从石头中挑出黄金 

    2.4 懒惰限定符

  "*?"   重复任意次,但尽可能少重复     >=0次    但为非贪婪算法

      如 "acbacb"  正则  "a.*?b" 只会取到第一个"acb" 原本可以全部取到但加了限定符后,只会匹配尽可能少的字符 ,而"acbacb"最少字符的结果就是"acb" 

  "+?"  重复1次或更多次,但尽可能少重复     >=1次    但为非贪婪算法

     与上面一样,只是至少要重复1次

  "??"  重复0次或1次,但尽可能少重复     =1次 或 =0次    但为非贪婪算法

      如 "aaacb" 正则 "a.??b" 只会取到最后的三个字符"acb"

  "{n,m}?"  重复n到m次,但尽可能少重复

        如 "aaaaaaaa"  正则 "a{0,m}" 因为最少是0次所以取到结果为空

  "{n,}?"    重复n次以上,但尽可能少重复

          如 "aaaaaaa"  正则 "a{1,}" 最少是1次所以取到结果为 "a"

    2.5 其他特殊符号及含义

        (?!d)表示这个位置后面不是数字。

将上述内容以图表呈现:

    

 


    上述意思分别为:在 /abc/ 中判断是否有 global 属性、ignoreCase 属性、multiline 属性。最后一个为取值 /abc/g 的正则内容。

    上述 compile 方法为改变正则内容,如上图原本 reg=/abc/; 修改后为 reg=/def/;

    1、search
        search 为检索,值为 索引值,为 -1 时表示不存在。
    2、replace
        没有设置 global 时,默认只替换第一个找到的值。
    注:replace 只能对字符串进行操作

        'gggabbbbcdef'.replace(/b/, '1');        值为 "ggga1bbbcdef";
        'gggabbbbcdef'.replace(/b+/, '1');        值为 "ggga1cdef";
        'gggabbbbcdef'.replace(/b+/g, '1');        值为 "ggga1cdef";
        'gggabbbbcdef'.replace(/b+?/, '1');        值为 "ggga1bbbcdef";
        'gggabbbbcdef'.replace(/b+?/g, '1');        值为 "ggga1111cdef";
        'gggabbbbcdef'.replace(/b*/, '1');        值为 "1gggabbbbcdef";
        'gggabbbbcdef'.replace(/b*/g, '1');        值为 "1g1g1g1a11c1d1e1f1";
        'gggabbbbcdef'.replace(/b*?/, '1');        值为 "1gggabbbbcdef";
        'gggabbbbcdef'.replace(/b*?/g, '1');        值为 "1g1g1g1a1b1b1b1b1c1d1e1f1";
        'gggabbbbcdef'.replace(/\Bb/, '1');        值为 "ggga1bbbcdef";

    3、match

        'gggabbbbcdef'.match(/b/);        值为 "b", index: 4;
        'gggabbbbcdef'.match(/b/g);        值为 (4) ["b", "b", "b", "b"];数组
        'gggabbbbcdef'.match(/b+/);        值为 "bbbb", index: 4;
        'gggabbbbcdef'.match(/b+/g);        值为 ["bbbb"];数组
        'gggabbbbcdef'.match(/b+?/g);        值为 (4) ["b", "b", "b", "b"];数组
        'gggabbbbcdef'.match(/b*/);        值为 "", index: 0;
        'gggabbbbcdef'.match(/b*/g);        值为 ["", "", "", "", "bbbb", "", "", "", "", ""];数组类型
        'gggabbbbcdef'.match(/b*?/g);        值为 (13) ["", "", "", "", "", "", "", "", "", "", "", "", ""];数组

三、正则的常用方法 :
    1、test()  :在字符串中查找符合正则的内容,若查找到返回true,反之返回false.

        用法:正则.test(字符串) 

        例子:监听 input 输入框中的内容是否 不为 整数,若是,清除输入值。

<input id="count" />
var integer = new RegExp(!/^\d+$/);		//定义整数正则表达式
document.getElementById('count').oninput = function () {
	if(integer.test(this.value)){ 
		this.value='';
	}
}

    2、search()  :在字符串中查找符合正则的值出现的位置(从0开始,且只会返回第一个符合要求的位置), 如果搜索失败就返回 -1 

   用法:字符串.search(正则)

    注:查找时经常不区分大小写

var str = 'abcdefgh';
var re = /ABC/i;
//var re = new RegExp('B','i'); 也可以这样写
alert( str.search(re) ); // 1

    3、match()  在字符串中搜索复合规则的内容,搜索成功就返回内容,格式为数组,失败就返回null。
     用法: 字符串.match(正则)
     量词:+ 至少出现一次 匹配不确定的次数(匹配就是搜索查找的意思)
    全局匹配:g——global(正则中默认,只要搜索到复合规则的内容就会结束搜索 )

    例子:找出指定格式的所有数字,如下找到 123,54,33,879
var str = 'haj123sdk54hask33dkhalsd879';
var re = /\d+/g;   // 每次匹配至少一个数字  且全局匹配  如果不是全局匹配,当找到数字123,它就会停止了。就只会弹出123.加上全局匹配,就会从开始到结束一直去搜索符合规则的。如果没有加号,匹配的结果就是1,2,3,5,4,3,3,8,7,9并不是我们想要的,有了加号,每次匹配的数字就是至少一个了。
alert( str.match(re) );   // [123,54,33,879]

    4、replace() :查找符合正则的字符串,就替换成对应的字符串。返回替换后的内容。

    用法: 字符串.replace(正则,新的字符串/回调函数)(在回调函数中,第一个参数指的是每次匹配成功的字符)
    注:替换往往需要加 g,全局

var str = "天青色等烟雨,而我在等你。";
var reg = /等/g;
var str2 = str.replace(reg,'*'); 
alert(str2)  //天青色*烟雨,而我在*你。
如果去掉 g ;结果为:天青色*烟雨,而我在等你。

要想实现几个字对应几个*,我们可以用回调函数实现:

var str = "天青色等烟雨,而我在等你。";
var re = /等|烟雨/g;
var str2 = str.replace(re,function(str){
              alert(str); //用来测试:函数的第一个参数代表每次搜索到的符合正则的字符,
                            所以第一次str指的是等 第二次str是烟雨 第三次str是等
            var result = '';
            for(var i=0;i<str.length;i++){
                result += '*';
            }              
            return result; //所以搜索到了几个字就返回几个* 
        });
alert(str2)  //天青色***,而我在*你。       

//整个过程就是,找到烟雨,替换成了两个*,找到等替换成了1个*。

    5、exec() :和match方法一样,搜索符合规则的内容,并返回内容,格式为数组。
    a: 不是全局匹配的情况:

var testStr = "now test001 test002";   
 var re = /test(\d+)/; //只匹配一次     
 var r = "";   
 var r = re.exec(testStr)
  alert(r);// test001  001 返回匹配结果,以及子项
  alert(r.length); //2   返回内容的长度
  alert(r.input); //now test001 test002    代表每次匹配成功的字符串 
  alert(r[0]);   //test001   
  alert(r[1]);  //001    代表每次匹配成功字符串中的第一个子项 (\d+) 
  alert(r.index );   //  4   每次匹配成功的字符串中的第一个字符的位置

    b: 如果是全局匹配,可以通过while循环 找到每次匹配到的字符串,以及子项。每次匹配都接着上次的位置开始匹配

var testStr = "now test001 test002";   
 var re = /test(\d+)/g;    
 var r = "";   

//匹配两次 每次匹配都接着上一次的位置开始匹配,一直匹配到最后r就为false,就停止匹配了 匹配到test001 test002  
while(r = re.exec(testStr)){
    alert(r);//返回每次匹配成功的字符串,以及子项,分别弹出 :test001 001,test002  002
    alert(r.input); //分别弹出:   now test001 test002    now test001 test002  
    alert(r[0]);   //代表每次匹配成功的字符串  分别弹出:  test001     test002
    alert(r[1]);  //代表每次匹配成功字符串中的第一个子项 (\d+)  分别弹出:001   002
    alert(r.index );   // 每次匹配成功的字符串中的第一个字符的位置,分别弹出:4  12
    alert(r.length); //分别弹出:2   2
}

常用方法总结:
    1、判断:正则.test(字符串);
        返回值:true 或 false
    2、索引:
        a、字符串.search(正则);
            返回值:符合正则的值出现的位置(从0开始,且只会返回第一个符合要求的位置), 如果搜索失败就返回 -1 
        b、字符串.match(正则);
             返回值:在字符串中搜索复合规则的内容,搜索成功就返回内容,格式为数组,失败就返回null
        c、正则.exec(字符串);
             返回值:和match方法一样,搜索符合规则的内容,并返回内容,格式为数组
    3、替换:字符串.replace(正则,新的字符串/回调函数);
        返回值:新的字符串

推荐:
廖雪峰的网站:点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值