正则表达式二
![](https://img2023.cnblogs.com/blog/1003774/202302/1003774-20230204155123380-1922393330.png)
在这 6 种元字符中,我们可以用 {m,n} 来表示 (*)(+)(?) 这 3 种元字符:
![](https://img2023.cnblogs.com/blog/1003774/202302/1003774-20230204155154071-1372080443.png)
贪婪与非贪婪模式。这两种模式都必须满足匹配次数的要求才能匹配上。贪婪模式,简单说就是尽可能进行最长匹配。非贪婪模式呢,则会尽可能进行最短匹配。
贪婪匹配(Greedy)
婪模式的特点就是尽可能进行最大长度匹配。
非贪婪匹配(Lazy)
非贪婪模式会尽可能短地去匹配,我把这两者之间的区别写到了下面这张图中。
![](https://img2023.cnblogs.com/blog/1003774/202302/1003774-20230204155444387-434874776.png)
独占模式(Possessive)
不管是贪婪模式,还是非贪婪模式,都需要发生回溯才能完成相应的功能。但是在一些场景下,我们不需要回溯,匹配不上返回失败就好了,因此正则中还有另外一种模式,独占模式,它类似贪婪匹配,但匹配过程不会发生回溯,因此在一些场合下性能会更好。
正则中量词默认是贪婪匹配,如果想要进行非贪婪匹配需要在量词后面加上问号。贪婪和非贪婪匹配都可能会进行回溯,独占模式也是进行贪婪匹配,但不进行回溯,因此在一些场景下,可以提高匹配的效率,具体能不能用独占模式需要看使用的编程语言的类库的支持情况,以及独占模式能不能满足需求。
![](https://img2023.cnblogs.com/blog/1003774/202302/1003774-20230204155556883-1865299924.png)
有一篇英文文章,里面有很多单词,单词和单词之间是用空格隔开的,在引号里面的一到多个单词表示特殊含义,即引号里面的多个单词要看成一个单词。现在你需要提取出文章中所有的单词。我们可以假设文章中除了引号没有其它的标点符号,有什么方法可以解决这个问题呢?如果用正则来解决,你能不能写出一个正则,提取出文章中所有的单词呢(不要求结果去重)?we found “the little cat” is in the hat, we like “the little cat”其中 the little cat 需要看成一个单词
\w+|“[^”]*”
脱字符(^)代表以这个正则开头,美元符号($)代表以正则结尾