正则表达式

一、概况

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 匹配非单词边界。
查找 NUL 字符。
查找换行符。
f 查找换页符。
查找回车符。
查找制表符。
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('	');
        }
    }
    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}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|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