正则表达式

一、概况

1、正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

2、正则引擎主要可以分为两大类:一种是DFA,一种是NFA。许多程序设计语言都支持利用正则表达式进行字符串操作。

二、组成

  1.定界符

^匹配输入字符串的开始位置。
$匹配输入字符串的结束位置。

  2.修饰符

i执行对大小写不敏感的匹配。
g执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m执行多行匹配。

  3.方括号 代表一类字符的集合

[abc]查找方括号之间的任何字符。
[^abc]查找任何不在方括号之间的字符。
[0-9]查找任何从 0 至 9 的数字。
[a-z]查找任何从小写 a 到小写 z 的字符。
[A-Z]查找任何从大写 A 到大写 Z 的字符。
[A-z]查找任何从大写 A 到小写 z 的字符。
[adgk]查找给定集合内的任何字符。
[^adgk]查找给定集合外的任何字符。
  4.元字符  代表一类字符的集合
元字符描述
.查找单个字符,除了换行和行结束符。
\w查找单词字符。
\W查找非单词字符。
\d查找数字。
\D查找非数字字符。
\s查找空白字符。
\S查找非空白字符。
\b匹配单词边界。
\B匹配非单词边界。
\0查找 NUL 字符。
\n查找换行符。
\f查找换页符。
\r查找回车符。
\t查找制表符。
\v查找垂直制表符。
\xxx查找以八进制数 xxx 规定的字符。
\xdd查找以十六进制数 dd 规定的字符。
\uxxxx查找以十六进制数 xxxx 规定的 Unicode 字符。

5.量词

n+匹配任何包含至少一个 n 的字符串。
n*匹配任何包含零个或多个 n 的字符串。
n?匹配任何包含零个或一个 n 的字符串。
n{X}匹配包含 X 个 n 的序列的字符串。
n{X,Y}匹配包含 X 至 Y 个 n 的序列的字符串。
n{X,}匹配包含至少 X 个 n 的序列的字符串。
n$匹配任何结尾为 n 的字符串。
^n匹配任何开头为 n 的字符串。
?=n匹配任何其后紧接指定字符串 n 的字符串。
?!n匹配任何其后没有紧接指定字符串 n 的字符串。

 

6.捕获组(子组)

()括号内的为子组内容


三、js正则使用

    对象方法
    var reg=new Regexp();
    reg.compile(regexp,string)    编译正则表达式
    reg.exec(string)            检索字符串中指定的值。返回找到的值,并确定其位置
    reg.test(string)            检索字符串中指定的值。返回 truefalse。
    
      字符串方法
    str.search(regexp)            检索与正则表达式相匹配的值。
    str.match(regexp)            找到一个或多个正则表达式的匹配。
    str.replace(regexp)            替换与正则表达式匹配的子串。
    str.split(regexp)            把字符串分割为字符串数组。

 

四、例子

1、去除空格

    // \s为元字符 空格, ^$为定界符
        var str1=' h e l l o ';
        var strRe1=str1.replace(/\s*/g,'');    //去除所有空格 g全局的作用  得到所有的匹配项
        var strRe2=str1.replace(/^\s*|\s*$/g,''); //去除左右空格
        console.log(str1.length,strRe1.length,strRe2.length);//11 5 9

 

 2、替换指定字符  

  // g为全局修饰符 无替换一次 有替换所有
  let str ='addtr1 23kn791addkn tr';
  let nstr=str.replace(/kn/,function(v){
    return '黑白kn';
  })
  console.log(nstr)//addtr1 23黑白kn791addkn tr
  let gnstr=str.replace(/kn/g,function(v){
    return '黑白kn';
  })

  console.log(gnstr)//addtr1 23黑白kn791add黑白kn tr

3、查找url地址

 

 

    /*    
  ?:     关闭分组的捕获功能 http :查找http s? :0个或一个s \/\/ :查找// \是转义区分表达式的开始结束 \w+ :元字符 字母数字下划线 +一个或多个 (\.\w+)*:()分组 \. 点 区分元字符所有 \w+同上 +一个或多个分组的内容 (\?\S*)?: 一个\?转义问号 /S非空格 * 0或多个
*/ var reg=new RegExp(/https?:\/\/\w+(\.\w+)+(\?\S*)?/); // var reg=new RegExp(/https?:\/\/\w+(\.\w+)+/); var str3='百度http://www.baidu.com.cn?usrname=kn'; // 两个结果一样 console.log(reg.exec(str3)); console.log(str3.match(reg))

//0为全部表达式结果 1为第一个()分组 2为第二个()分组

 

 

 4、查找素数

    // 1111 1       false   5
    // 1111 111     false   7
    // 111 111 111  true    9
    // 11 11 11 11 11  true    10
    var str=Array(9+1).join('1');
    console.log(/^(11+?)\1+$/.test(str));//判断是否为质数的正则
    // console.log(str.match(/^1?$|^(11+?)\1+$/));
    //(11+?) 消除贪婪 从最小范围往 大范围找 (1(1+?))
    //()     捕获组
    //\1     反向引用,使用第一个捕获组

    var t=[];
    for(var i=2;i<10;i++){
        if(!/^(11+?)\1+$/.test(Array(i+1).join('1'))){
            t.push(i);
            t.join('\t');
        }
    }
    console.log(t);

 

 5、千分位

//?=N 匹配任何其后紧接指定字符串 n 的字符串。
//?!N 匹配任何其后没有紧接指定字符串 n 的字符串。
  let num='5201314' let nnum=num.toString().replace(/(?=(\d{3})+(?!\d))/g, ",");
//简化
//5,201,314 true
//52,014,14 false
//520,131,4 false
  num.toString().replace( /(?=(\d{3})+$)/g, ',');

 

6、验证ip的合法性

 1     var str="1.1.1.1;2.2.2.2;255.255.255.255;0.0.0.0"
 2     function regCheckIp(val){
 3         var reg=/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
 4         var arr=val.replace(/^\s*|\s*$/g,'').split(';')
 5         for(var i in arr){
 6             if(arr[i].search(reg)==-1){
 7                 return true;
 8             }
 9         }
10         return false;
11     };
12     regCheckIp(str)

 7、获取文件后缀名

1     function validate(str){ 
2         var a=str.split('.').pop();
3         console.log(a)   //txt
4         /*var d=str.match(/\.[^\.]+$/)
5         console.log(d) //[".txt", index: 8, input: "test.1.3.txt"]*/
6     } 
7     validate("test.1.3.txt")

 8、模板替换 [],{{}}

    /*********7、模板替换功能************************************************************/
        // var reg = new RegExp("\\[([^\\[\\]]*?)\\]", 'igm'); 匹配 [] 内的内容替换
    var reg = /\{\{(.+?)\}\}/g;        //匹配 {{}} 的内容替换
    var html="[title]--[dateA]--{{title}}---{{dateA}}"

    var source = html.replace(reg, function (node, key) {

        return {
            'title': '我是hbuilder啊,哈哈哈哈',
            'dateA': '2016-09-19'
        }[key];
    });
    console.log(source)

 

 

 
 
 

 

转载于:https://www.cnblogs.com/blog-index/p/6604927.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值