• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
黑白kn
博客园    首页    新随笔    联系   管理    订阅  订阅

正则表达式

一、概况

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)            检索字符串中指定的值。返回 true 或 false。
    
      字符串方法
    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)

 

 

 
 
 

 

posted @ 2017-03-26 17:48  黑白kn  阅读(502)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3