南开小巷

导航

正则表达式学习

正则在线匹配的网站: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)之后,大部分情况下,我们就可以使用“反斜杠+编号”,即\number的方式来进行引用,而JavaScript中是通过$编号来引用,如$1

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

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

 九:课后练习题:

 

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

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

 

 

 

 

 

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

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

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

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

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

其实目的就是能匹配多行

 

 

 十二:多行匹配模式

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

 

这个是正则表达式的模式修饰符。
  (?i)即匹配时不区分大小写。表示匹配时不区分大小写。

  (?s)即Singleline(单行模式)。表示更改.的含义,使它与每一个字符匹配(包括换行 符\n)。

  (?m)即Multiline(多行模式) 。 表示更改^和$的 含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的 精确含意是:匹配\n之前的位置以及字符串结束前的位置.)
  (?x):表示如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。
  (?e):表示本修饰符仅仅对于replacement有用,代表在replacement中作为PHP代码。
  (?A):表示如果使用这个修饰符,那么表达式必须是匹配的字符串中的开头部分。比如说"/a/A"匹配"abcd"。
  (?E):与"m"相反,表示如果使用这个修饰符,那么"$"将匹配绝对字符串的结尾,而不是换行符前面,默认就打开了这个模式。
  (?U):表示和问号的作用差不多,用于设置"贪婪模式"。

 

posted on 2020-08-11 20:00  南开小巷  阅读(293)  评论(0编辑  收藏  举报