1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
      <output id="hzk7v"></output>
    2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
    3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>

      浅谈正则速记法的?#35760;?/h1>

       更新时间2019年01月09日 09:51:14   投稿zx   我要评论

      这篇文章主要介绍了浅谈正则速记法的?#35760;ɣ?#23545;大部分人来说正则主要是难记其实只要对正则符号分类记忆就会发现核心概念其实特别简单感兴趣的小伙伴们可以参?#23478;?#19979;

      给你一篇文章如何挑选出你想要的字符串呢你可以从左到右从?#31995;?#19979;一个一个字符读取出来写一大堆if做判断这样太麻烦了正则就是将以上过程抽象出来用一些特定符号就能表示出大部分规则

      对大部分人来说正则主要是难记其实只要对正则符号分类记忆就会发现核心概念其实特别简单

      注本文会假设你至少看过一遍正则的文档如果没看过可以看mdn有中文翻译如果觉得mdn排版乱推荐去https://devdocs.io/javascript/global_objects/regexp学习本文所使用语言为javascript

      元字符

      /a/中的a就是一个元字符一个元字符匹配一个实体字符这里的a没有特殊含义就匹配一个英文a

      /\d/就匹配0到9的所有数字如果两个连写/\d\d/就可以匹配10到99的所有数字

      /./可以匹配任何字符

      集合

      假如有一串字符串'0123456789'我只想匹配其中的'3','6','9'这时可以放在集?#29616;?code>/[369]/

      执行后会发现只有3被匹配到是因为集?#29616;?#19981;管写多少东西都代表一个元字符集合也是一种元字符
      你可能见过这样?#25216;?#21512;/[0-9a-zA-Z_]/它代表匹配所有数字字母和下划线它与元字符/\w/的效果是一样的集合更灵活\w更方便

      排除型集合

      /[^0-9]/除了数字?#35745;?#37197;我?#19981;兴?#21542;定集合

      或多选

      假设我有一大堆书单我希望从中匹配出naroto和one piece那么可以这样写/naroto|one pice/ 竖线代表或a或b你?#37096;?#20197;写多个a|b|c|d你当然可以写出0|1|2...|9来匹配所有数字但要注意和集合的区别集合是一个元字符不能匹配单词|两边可以是多个元字符

      分组

      我现在有一堆文件我希望匹配出后缀是.css和.less的文件你可以很自然的写出/.css|.less/这样的代码其实还有一个简便写法/.(c|le)ss/分组可以将若干个元字符放在同一个作用域中做处理通过分组我们可以写出更简练的代码

      分组还有一个特殊的用法思考如何匹配'asd_asd_asd_asd_asd'这种字符串?

      答案是/(asd)(_\1)+/\1是个?#27973;?#29305;殊的元字符代表重?#35789;?#29992;第一个分组的匹配结果\2就代表第二个以此类推+加号表示重复一到多次这个后面会讲需要注意的是计数从1开始\0代表另外的意思请看文档

      量词

      一长串字符中我只想匹配连续的数字但/\d/只会匹配一个这时候可以使用量词/\d{n,}/n写几就是几到多比如{1,}就是1到多{n}这?#20013;?#27861;表示n个相连匹配2333可以写成/23{3}/

      还有几个简写的量词

      • +代表1到多等于{1,}
      • *代表0到多等于{0,}
      • ?代表0或1个等于{0,1}

      贪婪模式和非贪婪模式

      量词有个尴尬的地方比如用/.*a/去匹配 '123a123a'本来希望得到'123a'实际却得到'123a123a'这是因为任何字符都满足/./加上量词会导致从头匹配到尾但因为我们还有其他元字符所以这时正则引擎会回溯将已经匹配的结果从后往前一个个拿出来与剩下的元字符相匹配
      这种模式叫贪婪模式它可能会产生预期之外的结果和不必要的性能浪费

      解决方案是使用非贪婪模式在量词后面加?问号可以得到最小结果现在使用/.*?a/去匹配就可以得到'123a'了任何量词后都可以使用非贪婪模式

      环视

      x(?=y)这个功能有很多种翻译比如零宽断言我个人感觉比较准确的是正向肯定环视
      x(?!y)正向否定环视

      x代表元字符y也代表元字符x(?=y)的意思是紧接着y的x比如 '-1a--2b-'使用/\d(?=a)/去匹配会得到1;/\d(?!a)/去匹配会得到2

      这功能怎么用举个例子有一段字符串'a(123)b'我只想要括号内的内容但不想要括号
      我需要匹配到右括号左边的位置那么我可以写成/(?=\))/(注意括号需要转义)我不想要左括号/[^(]/我不关心括号内的内容/.*/这时组合三个正则就变成了/[^(].*(?=\))/

      实际上这个功能匹配的是位置从匹配到的位置开始?#20197;?#23383;符所以你如果在环视后面加量词是没用的

      其他

      ^$也是匹配位置的元字符分别是匹配开头和结尾比如我们想匹配文件结尾是.js的文件可以写成/.js$/匹配http开头的链接可以写成/^http:\/\//

      还有一些特殊的\u[\b]\0等需要你自己看文档

      标识符

      g一个正则只会匹配一次如果加上g标识符就会全?#21046;?#37197; /\d/g这个正则是不管两个数字之间隔了什么都会将所有数字匹配出来

      i不区分大小写/^http:\/\//i就会匹配http://和HTTP://

      核心概念就这么多其他内容请详细查看文档

      你以为这就结束了其实还有后续哒

      我要继续说环视

      还有个神奇的逆向环?#29992;?#26377;讲x(?<=y) 因为这是18年才进正式标准的功能虽然它可能比js年龄大但js就是不支持你怕不怕

      前面那个/[^(].*(?=\))/可以改成/(?<=y).*(?=\))/

      正则最大但坑就是让新手产生正则无所不能的想法一个复杂字符串处理总以为可以通过一个神奇的正则来搞定

      正则不是万能的

      还是之前的例子给字符串'a(1\(2(3)'让你取括号内的内容请问你怎么取首先应该弄清需求如果正则过于难写可以用js的字符串处理函数辅助正则分部操作另外正则的性能并不高不是说很复杂的操作写成一行正则性能就比其他方式快了没有测试就没有发言权

      正则理论上是有极限的举个例子有字符串1xxxyyyy2让你取{n}个x和{m}个yn和m是不确定个数写成x{1,}y{1,}是没问题的但如果要求是x{n}y{n}就不行了比如一个字符串有3个x你就要取3个y有4个x你就要取4个y单靠正则就无法完成了

      正则难难在门槛高门槛高在难记之所以难记其实还是因为反人类的符号让你下意识的排斥它熟悉正则正式正则学会正则会给你带来超乎想象的便利

      以上就是本文的全部内容希望对大家的学习?#20852;?#24110;助也希望大家多多支持脚本之家

      相关文章

      最新评论

      3dԻв

        1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
          <output id="hzk7v"></output>
        2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
        3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>

            1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
              <output id="hzk7v"></output>
            2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
            3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>