• javascript正则表达式(RegExp)简述


    首先我们来思考以下两个个场景

    1. 我们使用window操作系统,有时候需要找一个文件,刚刚好这个文件我不知道放哪里去了,这个时候我们该怎么办呢?
    2. 我们使用word写论文的时候,不小心将“订价”中的“订”字写成了“定”,这时候我们该怎么办呢?

      对于第一种情况,我们就会用到系统的文件搜索功能,输入文件的名字,系统就会帮我们找到这个文件的位置。
      对于第二种情况,我们会用到软件提供的替换功能,首先查找错误的内容,然后将错误的内容替换成正确的内容。


    类似的场景有很多。
    可以发现,这两种情况有些相似,都是根据输入的关键词,查找到特定的内容,然后做进一步处理。

    这就是正则表达式最常用的场景。


    正则表达式通常是在计算机系统中,用以匹配特定的字符。匹配也可以理解为查找。

    让我们来看看最简单的正则表达式:

    var pat1 = /hi/;
    var pat2 = /hello/;
    var pat3 = /a/;
    var pat4 = /d/;
    var pat5 = /e/;
    var pat6 = /[f]/;

    上面几个就是最简单的正则表达式,可以看到,正则表达式是非常简单的

    通过上面几个正则表达式可以看到,正则表达式是写在两个斜杠之间的。
    记住,是斜杠:/,不是反斜杠:
    斜杠向左,反斜杠向右。

    接下来我们来认识三个括号:
    小括号:()
    中括号:[]
    大括号:{}
    这三个括号是正则表达式的语法之魂。


    小括号将正则表达式内容分组:可以将任何字符或者块进行分组,通常用在该块被其他条件限定的时候,比如长度限定,比如选择

    //匹配:acd,bcd
    var patter1 = /(a|b)cd/;
    
    //匹配:abcdefgh
    var patter2 = /abcd(ef)gh/;
    
    //匹配:aefg,aefh,befg,befh,cefg,cefh,defg,defh
    var patter3 = /[abcd](ef)[gh]/;
    var patter3 = /[abcd]ef[gh]/;

    中括号表示字符范围,无论中括号里面有多少内容,一个中括号只匹配一个字符或者一个子表达式(子表达式可以理解成一个字符)

    //匹配:ac,bc,ad,bd
    var patter1 = /[ab][cd]/;
    
    //匹配:a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
    var patter2 = /[a-z]/;
    
    //匹配:0,1,2,3,4,5,6,7,8,9
    var patter3 = /[0-9]/;
    
    //匹配:h,e,l,o
    var patter4 = /[helo]/;
    
    //匹配除了a,b,c之外的任何字符
    var patter5 = /[^abc]/;
    
    //除了小写字母之外的其他任何字符
    var patter6 = /[^a-z]/;

    大括号用来控制字符长度。大括号用来表示1个字符或者1个子表达式的长度

    // 匹配:a
    var p1 = /a{1}/;
    
    // 匹配:abcabc
    var p2 = /abc{2}/;
    
    // 匹配:abcabc或者2个以上的abc
    var p3 = /abc{2,}/;
    
    // 两个或者2个以上6个以下的abc,包括6个
    var p4 = /abc{2,6}/;

    我们再来看一些正则表达式的例子:

    // 匹配a或者b或者c
    var p1 = /[abc]/;
    
    // 匹配abc
    var p2 = /abc/;
    
    // 匹配a到z中的任意一个字母
    var p3 = /[a-z]/;
    
    // 匹配阿拉伯数字中的任意一个
    var p4 = /[0-9]/;
    
    // 匹配1或者2或者3或者4
    var p5 = /[1234]/;
    
    // 匹配一个或者两个或者3个“hello”
    var p6 = /hello{1,3}/;
    
    // 匹配ac,acac,ad,adad,bc,bcbc,bd,bdbd
    var p7 = /([ab][cd]){1,2}/;
    
    // 匹配一个abd或者一个acd
    var p8 = /(a[bc]d){1}/;
    
    // 匹配一个或者一个以上(2,3,4,5,6,7......)的abd、匹配一个或者一个以上(1,2,3,4,5,6......)的acd
    var p9 = /(a[bc]d){1,}/;
    
    
    // 匹配
    // adcd,aeae,afaf
    // bdbd,bebe,bfbf
    // cdcd,cece,cfcf
    var p10 = /([abc][def]){2}/;
    
    // 匹配abab
    var p11 = /([a][b]){2}/;
    
    // 匹配abab
    var p12 = /(ab){2}/;
    
    // 匹配abb
    var p13 = /ab{2}/;
    
    // 匹配abab,cdcd
    var p14 = /[(ab)(cd)]{2}/;

    通过以上我们的学习,我们看到,正则表达式的语法最核心的就是三个括号:()、[]、{}
    小括号用来分组,分组成子表达式,一个小括号可以理解成一个字符
    中括号是用来表示字符,匹配的内容是其中的一个
    大括号只是用来确定字符或者子表达式(可以理解成一个字符)的长度,有三种情况:
      {n}  表示n长度
      {n,}  表示至少n长度,无上限
      {n,m}  表示n-m之间的长度

    学习正则表达式,就是要掌握最基本的语法。

    我们上面说的这些是正则表达式吗?好像和我以前看到的不一样呢。别急,我们再来看几个:
    看看下面的这几个:

    var pt1 = /^((https|http|ftp|rtsp|mms)?://)[^s]+/;
    var pt2 = /w[-w.+]*@([A-Za-z0-9][-A-Za-z0-9]+.)+[A-Za-z]{2,14}/;
    var pt3 = /[A-Za-z0-9_-u4e00-u9fa5]+/;
    var pt4 = /[^x00-xff]/;
    var pt5 = /[u4e00-u9fa5]/;

    好像这五个才是真正的正则表达式吧。

    没错,这些也是正则表达式,可是为什么和我们刚才学习到的不一样呢?
    回过头来,我们刚才说正则表达式最核心的东西是三个括号:(),[],{}
    看看上面这几个正则表达式,我们研究一下
      第一个里面出现了(),[]
      第二个里面出现了(),[],{}
      第三个里面有[]
      第四个里面有[]
    不过,这几个表达式里面的其他看起来乱七八糟的东西都是什么呢?
    比如下面几个:|,^,\,.,+,?
    当然还有一些其他的,这里就不一一列举了。
    我们再接着说大括号的事情。
      {0}  0
      {0,1}  0或者1
      {0,}  0个以上
      {1}  1个
      {1,}  至少1个
    大括号是限定字符长度的,刚好,有人觉得老是写大括号,有点烦了,于是创造了下面几个等价字符
    *,任意长度,0次或者多次,即1,2,3,4,5,6,7,8......
      等价于{0,}
    +,一次或者多次(至少一次)
      等价于{1,}
    ?,零次或者一次
      等价于{0,1}

    所以上面那几个表达式就可以进行替换了:上面五个表达式也可以写成下面这样。

    var pt1 = /^((https|http|ftp|rtsp|mms){0,1}://)[^s]{1,}/;
    var pt2 = /w[-w.+]{0,}@([A-Za-z0-9][-A-Za-z0-9]{1,}.){1,}[A-Za-z]{2,14}/;
    var pt3 = /[A-Za-z0-9_-u4e00-u9fa5]{1,}/;
    var pt4 = /[^x00-xff]/;
    var pt5 = /[u4e00-u9fa5]/;

    所以当在表示字符长度的时候,完全可以用这三个字符(*、+、?)与中括号的表达方式进行互相替换。

    正则中出现了这些符号,自然就会使正则看起来乱七八糟了。

    上面还有没有可以进行替换的呢?当然有。

    下面是一个表格,是正则表达式里面规定的可以进行互换的字符。

    

    匹配一个单词边界,也就是指单词和空格间的位置
    B 匹配非单词边界。
    cx 匹配由x指明的控制字符。
    d 匹配一个数字字符。等价于[0-9]。
    D 匹配一个非数字字符。等价于[^0-9]。
    f 匹配一个换页符。等价于x0c和cL。
    匹配一个换行符。等价于x0a和cJ。
    匹配一个回车符。等价于x0d和cM。
    s 匹配任何不可见字符,包括空格、制表符、换页符等等。等价于[ f v]。
    S 匹配任何可见字符。等价于[^ f v]。
    匹配一个制表符。等价于x09和cI。
    v 匹配一个垂直制表符。等价于x0b和cK。
    w 匹配包括下划线的任何单词字符。类似但不等价于“[A-Za-z0-9_]”,这里的"单词"字符使用Unicode字符集。
    W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。

    根据上面的表格,我们还可以 继续改写上面的五个正则表达式。将其中的一些字符进行替换。

    亲爱的朋友,您不妨试试。

    思考一个问题:如果我们要匹配小括号,中括号或者大括号本身呢?
    这个时候反斜杠就起大作用了。

    转义字符:“”
    转义字符的作用是将下一个字符标记为一个特殊字符:
      \ 表示匹配 ""
      ( 表示匹配 "("
      ) 表示匹配 ")"
       表示一个换行符
      [ 表示匹配 "["

    比如:

    // 匹配:hi[j]
    var patter = /hi[j]/;
    
    // 匹配:hello
    var patter = /\hello/;

    转义字符基本上在每个编程语言中都会存在,和这里的作用一样,将转义字符后面的字符标记为特殊字符。

    这里介绍的正则表达式是最简单的描述,而且这里基本上没有介绍关于正则表达式的概念。如果想要深入了解正则表达式,需要学习下面的一些名词:

    RegExp,量词,元字符,反向引用,回溯,分组,子表达式,零宽断言,贪婪模式,懒惰模式,前后查找。

    不过在日常工作中,学会了基本的语法后,就可以进行开发了。在工作过程中,通过实战,相信你会对正则表达式越来越熟悉。

    上面是正则表达式的入门。

    需要说明的是,正则表达式不是一门编程语言,目前几乎所有的编程语言都会有正则表达式这一模块,用来处理字符串相关的内容。比如说javascript中,有专门的RegExp对象来做正则相关的处理。其它语言,比如php,Java,Python等,都有相关的内容。

    我是一名前端,所以接下来我来分享一下我在前端开发中,在javascript中使用正则表达式的一些体会。

    javascript中一共有七个方法可以做正则方面的处理

    RegExp对象有三个方法:

      compile()

      exec()

      test()

    String对象有四个方法

      search()

      match()

      replace()

      split()

    / RegExp对象有三个方法:
    //   compile()
    //   exec()
    //   test()
    
    // String对象有四个方法
    //   search()
    //   match()
    //   replace()
    //   split()
    
    // 创建字符串对象
    var a_str = "hello world, She is a beautiful girl and he is a boy";
    
    //创建正则表达式对象
    var patter = /he/i;
    
    // 正则对象方法:
    
    // 返回一个数组,其中存放匹配的结果。此方法非常强大。这里只做一个简单的示例
    patter.exec(a_str);
    
    // 判断字符串中是否有匹配结果,如果有的话,返回TRUE,如果没有返回FALSE
    patter.test(a_str);//true
    
    // 字符串方法
    //返回匹配到的第一个子串的起始位置,如果没有则返回-1
    a_str.search(patter);
    
    // 返回一个或者多个匹配的值
    a_str.match(patter);
    
    // 将字符串中的子串进行替换
    a_str.replace(patter,"hello");
    
    // 将字符串分割
    a_str.split(patter);

    上面还有一个没有提到的,javascript中的正则表达式修饰符。修饰符有三种,分别是全局(g),忽略大小写(i),多行匹配(m)

    //忽略大小写
    var patter1 = /hello/i;
    
    //多行匹配
    var patter2 = /hello/m;
    
    //全局匹配
    var patter3 = /hello/g;

    正则表达式是开发中一个强有力的工具。学好正则表达式,走遍天下都不怕。

    我是沛笠。欢迎各位程序猿和程序媛前来勾搭。

    微信号;pelligit

    QQ:2653807423

    giithub:www.github.com/pelligit

    晚安。

  • 相关阅读:
    SQL的高级属性-
    查询
    SQL语句
    CSS的创建样式
    表单部分属性值
    HTML的语法和基本标签
    网页制作与HTML基本结构
    小程序button 去边框
    关于axios跨域带cookie
    Uncaught Error: code length overflow. (1604>1056)
  • 原文地址:https://www.cnblogs.com/pelli/p/6250791.html
Copyright © 2020-2023  润新知