zoukankan      html  css  js  c++  java
  • 正则表达式学习

    正则在线匹配的网站:https://regex101.com/

    1.所谓的元字符就是指那些在正则表达式中具有特殊意义的专用字符,比如d 表示的就是数字,正则就是由一系列的元字符组成的。

    2.按照分类来记忆元字符:特殊字符、空白符、范围、量词、断言

       2.1 特殊字符:

      . 表示换行以外的任意字符

           d 任意数字    D 任意非数字

           w 任意字母数字下划线    W任意非字母数字下划线

           s 任意空白符   S 任意非空白符   

     

      s能匹配上各种空白符号,也可以匹配上空格,换行有专门的表示方式,在正则中,空格就是用普通的字符英文的空格来表示

    3.量词   

     基础元字符,空白符,它们都只能匹配单个字符,比如d只能匹配一个数字,但有的时候,我们需要匹配单个字符,或者某个部分"重复N次" "至少出现一次"   "最多出现三次"等等这样的字符,

     在正则中,* 表示出现0到多次,加号(+)代表1到多次,问号(?)表示0到1次,{m,n}代表m到n次

     4.范围

     二:正则中的三种模式:贪婪匹配、非贪婪匹配、独占模式。比如匹配一次到多次的时候,匹配长度是尽可能长还是尽可能短呢?如果不知道贪婪模式和非贪婪模式,我们就不知道我们写的正则表达式是否正确

    贪婪模式:简单说就是尽可能进行最长匹配;非贪婪模式:则会尽可能进行最短的匹配

    在正则中,表示次数的量词默认是贪婪的,在贪婪模式下,会尝试尽可能最大长度去匹配

     如何将贪婪模式变成非贪婪模式呢?可以在量词后面加上英文的问好(?),例如a*?

    不管是贪婪模式,还是非贪婪模式,都需要发生回溯才能完成相应的功能,但是一些场景下,我们不需要回溯,匹配不上返回失败就好

    独占模式和贪婪模式很像,独占模式会尽可能多地去匹配,如果匹配失败就结束,不会进行回溯,这样的话就比较节省时间,具体的方法是在量词后面加上(+)

    三:总结:如果只是判断文本是否符合规则,则可以使用独占模式;如果需要获取匹配的结果,则根据需要使用贪婪或非贪婪模式

    四:在大多数的正则实现中,多分枝的选择都是左边优先

    五:括号在正则中的功能就是用于分组。简单来理解就是,由多个元字符组成某个部分,应该被看成一个整体的时候,可以用括号括起来表示一个整体,这是括号的一个重要功能

    六:什么是不保存子组?我们可以理解成,括号只用于归组,把某个部分当成“单个元素”,不分配编号,后面不会再进行这部分的引用

    七:分组引用:在知道了分组引用的编号(number)之后,大部分情况下,我们就可以使用“反斜杠+编号”,即 umber的方式来进行引用,而JavaScript中是通过$编号来引用,如$1

    八:查找重复出现的单词,我们使用正则可以很方便的使:"前面出现的单词再次出现", 用 w+ 来表示一个单词,所以 (w+) 1 就能匹配到重复的单词,这是为什么呢?

    因为分组后,后面可以用分组编号引用,这样就是重复出现的意思

     九:课后练习题:

     解题的思路是:w+ 用于选中出现一次到多次的字母,由于默认贪婪匹配最长,所以能选中每个单词,由于是要找出重复的单词,所以要用第一次匹配成功的结果即使用分组 (w+) 1,到此可以拿到重复两次场景的结果,对于重复两次以上的结果,需要重复刚刚的行为,但是不能一直叠加 1 ,自然想到了 +,得到了 (w+) (1)+,发现匹配不成功,在这里卡壳了一段时间没想明白,翻到别人的答案才猛然想起来单词之间应该有空隙,(1)+不能表示空隙,用s代替敲出来的空格最终得到 (w+)(s+1)+

     十:正则中的匹配模式:指的就是正则中一些改变元字符匹配行为的方式,比如匹配时不区分英文字母大小写,常见的匹配模式有4种:分别是不区分大小写模式、点号通配模式、多行模式和注释模式

     

     总结一下不区分大小写模式的知识点:

    1. 不区分大小写模式的指定方式,使用模式修饰符(?i)

    2.修饰符如果在括号内,作用范围是这个括号内的正则,而不是整个正则

    3.使用编程语言时可以使用预定义好的常量来指定匹配模式

    十一:点号通配模式:最直观的解释是之前的元字符.能匹配上所有的字符,但是匹配不了换行,现在是需要让.也能匹配上换行,那就需要用点号通配模式:(?s)

    其实目的就是能匹配多行

     

     十二:多行匹配模式

    这个多行匹配模式的作用:在处理日志时,如果日志以时间开头,有一些日志打印了堆栈信息,占用了多行,我们就可以使用多行匹配模式,在日志中匹配到以时间开头的每一行日志

  • 相关阅读:
    PAT 甲级 1027 Colors in Mars
    PAT 甲级 1026 Table Tennis(模拟)
    PAT 甲级 1025 PAT Ranking
    PAT 甲级 1024 Palindromic Number
    PAT 甲级 1023 Have Fun with Numbers
    PAT 甲级 1021 Deepest Root (并查集,树的遍历)
    Java实现 蓝桥杯VIP 算法训练 无权最长链
    Java实现 蓝桥杯VIP 算法训练 无权最长链
    Java实现 蓝桥杯 算法提高 抽卡游戏
    Java实现 蓝桥杯 算法提高 抽卡游戏
  • 原文地址:https://www.cnblogs.com/zhangshitong/p/13479686.html
Copyright © 2011-2022 走看看