美文网首页
正则表达式

正则表达式

作者: whowhenhowxxx | 来源:发表于2018-08-22 00:34 被阅读0次

    /正则表达式主体/修饰符(可选)

    在 JavaScript 中,正则表达式通常用于两个字符串方法 : search() 和 replace()。

    • search() 方法 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。
    • replace() 方法 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
    image.png

    正则表达式模式

    image.png image.png image.png

    正则表达式表单验证实例:

    /*是否带有小数*/
    function    isDecimal(strValue )  {  
       var  objRegExp= /^\d+\.\d+$/;
       return  objRegExp.test(strValue);  
    }  
    
    /*校验是否中文名称组成 */
    function ischina(str) {
        var reg=/^[\u4E00-\u9FA5]{2,4}$/;   /*定义验证表达式*/
        return reg.test(str);     /*进行验证*/
    }
    
    /*校验是否全由8位数字组成 */
    function isStudentNo(str) {
        var reg=/^[0-9]{8}$/;   /*定义验证表达式*/
        return reg.test(str);     /*进行验证*/
    }
    
    /*校验电话码格式 */
    function isTelCode(str) {
        var reg= /^((0\d{2,3}-\d{7,8})|(1[3584]\d{9}))$/;
        return reg.test(str);
    }
    
    /*校验邮件地址是否合法 */
    function IsEmail(str) {
        var reg=/^\w+@[a-zA-Z0-9]{2,10}(?:\.[a-z]{2,4}){1,3}$/;
        return reg.test(str);
    }
    
    image.png

    一般[]中的字符没有特殊含义 如+就表示+
    但是像\w这样的还是有特殊含义的
    []中,不会出现两位数
    ()的提高优先级功能:凡是有|出现的时候,我们一定要注意是否有必要加上()来提高优先级;

    当我们加()只是为了提高优先级而不想捕获小分组时,可以在()中加?:来取消分组的捕获

    image.png
    ()  []  {} 的区别
    () 的作用是提取匹配的字符串。表达式中有几个()就会得到几个相应的匹配字符串。比如 (\s+) 表示连续空格的字符串。
    [] 是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示字符文本要匹配英文字符和数字。
    {} 一般用来表示匹配的长度,比如 \d{3} 表示匹配三个数字,\d{1,3} 表示匹配1~3个数字,\d{3,} 表示匹配3个以上数字。 
    ^ 与 $
    ^ 匹配一个字符串的开头,比如 (^a) 就是匹配以字母a开头的字符串
    $ 匹配一个字符串的结尾,比如 (b$) 就是匹配以字母b结尾的字符串
    ^ 还有另个一个作用就是取反,比如[^xyz] 表示匹配的字符串不包含xyz
    

    $1 与 \1

    $1-$9 存放着正则表达式中最近的9个正则表达式的提取的结果,这些结果按照子匹配的出现顺序依次排列。基本语法是:RegExp.$n ,这些属性是静态的,除了replace中的第二个参数可以省略 RegExp 之外,其他地方使用都要加上 RegExp 。

    //使用RegExp访问
    /(\d+)-(\d+)-(\d+)/.test('2016-03-26') 
      
    RegExp.$1  // 2016
    RegExp.$2  // 03
    RegExp.$3  // 26
     
    //在replace中使用
    '2016-03-26'.replace(/(\d+)-(\d+)-(\d+)/, '$1年$2月$3日')  
    // 2016年03月26日
    

    \1 表示后向引用,是指在正则表达式中,从左往右数,第1个()中的内容,以此类推,\2表示第2个(),\0表示整个表达式。

    //匹配日期格式,表达式中的\1代表重复(\-|\/|.)
    var rgx = /\d{4}(\-|\/|.)\d{1,2}\1\d{1,2}/
     
    rgx.test('2016-03-26') // true  
     
    rgx.test('2016-03.26') // false
    

    两者的区别是:\n 只能用在表达式中,而 $n 只能用在表达式之外的地方。

    test 与 match

    test则是用来检测字符串是否匹配某一个正则表达式,如果匹配就会返回true,反之则返回false
    match是获取正则匹配到的结果,以数组的形式返回

    replace([RegExp|String], [String|Function])

    如果第1个参数是 RegExp,JS会先提取RegExp匹配出的结果,然后用第2个参数逐一替换匹配出的结果
    如果第2个参数是回调函数,每匹配到一个结果就回调一次,每次回调都会传递以下参数:

    result: 本次匹配到的结果
    1,...9: 正则表达式中有几个(),就会传递几个参数,1~9分别代表本次匹配中每个()提取的结果,最多9个
    offset: 记录本次匹配的开始位置
    source: 接受匹配的原始字符串
    var str = 'abbbbAAbcBCCccdaACBDDabcccddddaab';
    str = str.toLowerCase().split('').sort(function(a,b){return a.localeCompare(b)}).join('');

    var reg = /(\w)\1+/ig;
    var maxStr = '';
    var maxLen = 0;
    str.replace(reg,function($0,$1){
        var regLen = $0.length;
        console.log('s0',$0);
        console.log('s1',$1);
        if(regLen>maxLen){
            maxLen = regLen;
            maxStr = $1;
        }else if(maxLen == regLen){
            maxStr += $1;
        }
    })
    console.log(`出现最多的字母是${maxStr},共出现了${maxLen}次`)
    

    注意$0代表返回的整个结果

    var str = 'assssjdssskssalsssdkjsssdss';
    
    var arr = str.split(''); //把字符串转换为数组
    str = arr.sort().join(''); //首先进行排序,这样结果会把相同的字符放在一起,然后再转换为字符串
    //alert(str);  // aaddjjkklsssssssssssssssss
    
     var value = '';
     var index = 0; 
    var re = /(\w)\1+/g;  //匹配字符,且重复这个字符,重复次数至少一次。
    str.replace(re,function($0,$1){ 
       //alert($0);   代表每次匹配成功的结果 : aa dd jj kk l sssssssssssssssss
         //alert($1);  代表每次匹配成功的第一个子项,也就是\w:  a d j k l S 
      
        if(index<$0.length){  //如果index保存的值小于$0的长度就进行下面的操作
              index = $0.length;  // 这样index一直保存的就在最大的长度
               value = $1;  //value保存的是出现最多的这个字符
        }
    
    }); 
    
    alert('最多的字符:'+value+',重复的次数:'+index);  // s   17
    
    //中文,全角,半角匹配:
     str="中文;;a"    
      alert(str.match(/[\u0000-\u00ff]/g))     //半角  
      alert(str.match(/[\u4e00-\u9fa5]/g))     //中文  
      alert(str.match(/[\uff00-\uffff]/g))     //全角
    
    

    判断是不是QQ号:

    //首先想QQ号的规则 
          1 首位不能是0 
          2 必须是 5-12位的数字
       
        var aInput = document.getElementsByTagName('input');
        var re = /^[1-9]\d{4,11}$/;
        //123456abc为了防止出现这样的情况,所以必须限制最后
        //首位是0-9,接着是4-11位的数字类型。
    aInput[1].onclick = function(){
        if( re.test(aInput[0].value) ){
            alert('是QQ号');
        }else{
            alert('不是QQ号');
        }
    
    };
    

    去掉前后空格:

    var str = '  hello  ';
    alert( '('+trim(str)+')' );//为了看出区别所以加的括号。 (hello)
    function trim(str){
       var re = /^\s+|\s+$/g; // |代表或者   \s代表空格  +至少一个    前面有至少一个空格 或者后面有至少一个空格 且全局匹配
      return str.replace(re,''); //把空格替换成空
    }
    

    相关文章

      网友评论

          本文标题:正则表达式

          本文链接:https://www.haomeiwen.com/subject/bkasiftx.html