正则掌握程度测试题——解答

标签(空格分隔): 正则表达式


注:解答时,点击“题样”链接,进行测试即可。 鼠标悬停到每段文字,右侧+可评论,大家可评论留下你的答案,我看到会适当加以回复,建议带上你们的Q群昵称(434252251 专精正则表达式)。 正则文章推荐正则表达式入门和高级教程与在线测试工具

正则掌握程度测试题——解答1. 分组提取/非捕获组(1.1)分组提取(1.2)非捕获组2. 单字符或(2)单字符或3. 多字符或(3)多字符或4. 分组引用(4)匹配连续相同3次的数字5. 匹配换行数据(5)匹配换行数据6. 存在(或)(6.1)匹配多种或条件的数据,没有特殊限制(6.2)匹配多种或条件的数据,有特殊限制(不使用环视)(6.3)匹配多种或条件的数据,有特殊限制(使用环视)7. 存在(与)(7.1)校验密码必须包含字母、数字和特殊字符,6-16位8. 特殊限制(环视否定)(8.1)使用\d{1,3}匹配1-999的数据,不能以0开头(8.2)匹配除了span标签外的所有标签9. 替换分组使用(9.1)给源串每个链接加上http://www.zjmainstay.cn前缀(9.2)将每行数据格式化为一条SQL语句10. 分组可选(10.1)分组可选(10.2)分组可选与分组引用11. 单字符拆分(数字)(11)匹配0.00-100.00的数值,可以有0-2位小数12. 贪婪模式(12.1)匹配链接中的文件名(12.2)限定字符贪婪优化匹配性能13. 非贪婪模式(13)匹配p标签内容14. 占用模式(PCRE)15. |字符分界(|的作用域)(15)|字符分界16. 元字符转义(16)元字符转义17. 分隔符绕过(PCRE)(17)分隔符绕过18. 匹配溢出排除(18.1)div标签匹配溢出(18.2)多字符排除(18.3)多字符排除19. 环视循环提取格式化20. 环视+递归引用表达式21. 三段论应用

1. 分组提取/非捕获组

分组,是正则里一个非常重要的概念,我们需要针对某个区域提取数据,往往需要依赖分组。而分组,其实就是正则里()括住的部分。

(1.1)分组提取

题样:https://hiregex.com/r/B7aH84/1

(1.2)非捕获组

针对上面的分组,有时候,我们并不需要捕获某个分组的内容,我们可以使用非捕获组(?:表达式),从而不捕获表达式部分内容到分组中。

题样:https://hiregex.com/r/hcspP2/1

2. 单字符或

或条件是正则使用过程中常用的概念,比如,密码由字母或数字组成,这里就用到了或条件,而且,由于字母或数字都是单个字符,因此,可以使用[a-z0-9]这样的单字符或语法实现。 常犯错误:匹配a或b写成[a|b],此表达式实际上表示a或b或|,在[]内部的|表示其本身,注意区分(a|b)表示a或b的写法。

(2)单字符或

题样:https://hiregex.com/r/JHkPH1/1

3. 多字符或

相对单字符或条件,多字符或也是很常见的,比如,我们需要匹配http或ftp两个协议头的url,就需要^(http|ftp)://.+$这样的语法来实现。

(3)多字符或

题样:https://hiregex.com/r/hyoAJ1/1

4. 分组引用

前面介绍了分组,那某个分组在我们匹配过程中重复出现,又该如何处理?分组引用恰恰解决这个问题。比如,匹配出现重复单词的一行数据,我们可以这么写(多行模式):/^.*?(\b\S+\b).*?\1.*$/m\1表示引用前面分组1中匹配到的内容,也就是重复的单词内容。

(4)匹配连续相同3次的数字

题样:https://hiregex.com/r/2p93c/1

5. 匹配换行数据

“我的正则本来好好的,突然不行了!”这个是很多正则新人遇到的问题,而这个问题,很多时候,就是因为原来正则中的.不能匹配新数据里的换行导致的。这时候,只需要把.改成[\s\S]这样的表达式就可以了。这个表达式表示空格或非空格,也就是任意字符啦。

(5)匹配换行数据

题样:https://hiregex.com/r/tYcOO3/1

6. 存在(或)

(6.1)匹配多种或条件的数据,没有特殊限制

题样:https://hiregex.com/r/n2FGC1/1

(6.2)匹配多种或条件的数据,有特殊限制(不使用环视)

题样:https://hiregex.com/r/L5kYV/1

(6.3)匹配多种或条件的数据,有特殊限制(使用环视)

题样:https://hiregex.com/r/9FJHT4/1

7. 存在(与)

(7.1)校验密码必须包含字母、数字和特殊字符,6-16位

题样:https://hiregex.com/r/6kEWf4/1

8. 特殊限制(环视否定)

(8.1)使用\d{1,3}匹配1-999的数据,不能以0开头

题样:https://hiregex.com/r/QIP8F4/1

(8.2)匹配除了span标签外的所有标签

题样:https://hiregex.com/r/Y77Z51/1

9. 替换分组使用

(9.1)给源串每个链接加上http://www.zjmainstay.cn前缀

题样:https://hiregex.com/r/gTDjO3/1

(9.2)将每行数据格式化为一条SQL语句

题样:https://hiregex.com/r/RIQTP4/1

10. 分组可选

(10.1)分组可选

题样:https://hiregex.com/r/nkwBu1/1

(10.2)分组可选与分组引用

题样:https://hiregex.com/r/4dIVO3/1

11. 单字符拆分(数字)

(11)匹配0.00-100.00的数值,可以有0-2位小数

题样:https://hiregex.com/r/mCpsV4/1

12. 贪婪模式

贪婪模式,正则会优先尽可能多地匹配能匹配到的内容。当剩余正则匹配剩余部分字符(源串)但无法满足匹配时,贪婪部分回溯,吐出已匹配的内容,尝试满足剩余部分字符的匹配。

(12.1)匹配链接中的文件名

题样:https://hiregex.com/r/wvCml3/1

(12.2)限定字符贪婪优化匹配性能

题样:https://hiregex.com/r/U6cJb4/1

13. 非贪婪模式

贪婪模式,正则会优先尽可能少地匹配能匹配到的内容。当剩余正则匹配剩余部分字符(源串)但无法满足匹配时,非贪婪部分继续匹配更多内容,尝试满足剩余部分字符的匹配。

(13)匹配p标签内容

题样:https://hiregex.com/r/dfiUF4/1

14. 占用模式(PCRE)

贪婪模式后再加一个+量词,如.++,效果是贪婪而且不回溯。 暂时没有想到应用场景。

15. |字符分界(|的作用域)

|作为或条件分隔符,它的分隔区间常常存在误用。在使用|字符的过程中,我们常常需要结合()来对它进行限定。如,^([0-9]+|[a-z]+)$表示纯数字或纯字母,如果没有(),那它又是另一种意思了。^[0-9]+|[a-z]+$等价于^[0-9]+[a-z]+$,因此,它表示数字开头或者字母结尾,跟我们的需求有了很大的差别。

(15)|字符分界

题样:https://hiregex.com/r/UAc4O2/1

16. 元字符转义

元字符,指正则中有特殊意义的字符,如.表示匹配除了换行符以外的任意字符,这个.就是元字符。在正则书写过程中,如果我们真的要匹配这个.,就需要对它进行转义,而不是让它使用正则的含义,比如,匹配域名里的.,我们就要写成/zjmainstay\.cn/这样的正则。

(16)元字符转义

题样:https://hiregex.com/r/DhPaI1/1

17. 分隔符绕过(PCRE)

有时候,如果该语言支持多种分隔符,在写正则的过程中通常会通过规避分隔符的方式,减少对分隔符的转义,让正则看起来更清晰,写起来更舒服,当然,js中是不支持的。

(17)分隔符绕过

题样:https://hiregex.com/r/hwDnS1/1

 

18. 匹配溢出排除

匹配溢出,这不是一个术语名词,是我自己的叫法,主要指正则匹配内容超出了我们预期,导致匹配得到非预期的结果。

(18.1)div标签匹配溢出

题样:https://hiregex.com/r/CNNqb1/1

(18.2)多字符排除

题样:https://hiregex.com/r/KyeQf1/1

(18.3)多字符排除

题样:https://hiregex.com/r/D4gQB1/1

19. 环视循环提取格式化

在数据处理过程中,经常遇到一些格式化处理,比如简单地将一批数据格式化为SQL(参考9.2),还有复杂的需要对一行数据的某部分进行循环提取,然后格式化为特定格式。

题样:https://hiregex.com/r/ntZT84/1

20. 环视+递归引用表达式

PCRE支持使用(?R)引用整个正则表达式,使用(?1)引用分组1的正则表达式,在处理的数据的过程可以通过这种方式让表达式无限扩展,类似平衡组的方式,平衡匹配目标数据。

题样:https://hiregex.com/r/QgjFM4/1

21. 三段论应用

三段论,是本人根据对正则的理解,归纳出来的三句话:定锚点,去噪点,取数据 锚点,在正则中指^$\b这类零宽的位置,这里做了衍生,指能够唯一确定我们目标数据位置的参照点,比如author=Zjmainstay,我们要匹配author属性的数据,则author=就是我们的参照点,通过它,我们能快速写出提取author属性的数据的正则:author=(.+) 噪点,就是对我们提取数据产生干扰的无关数据,我们在做正则匹配提取数据的过程中,可以选择性的忽略它们。当然,这里的忽略不是指不需要对它们做匹配,而是不需要对它们做精确匹配。比如,<a class="some-class-1 some-class-xxx" style="border:1px solid" href="http://www.zjmainstay.cn/regexp" title="正则表达式教程">正则表达式</a>,我们要提取a标签的url和文本(正则表达式),这时候,a标签上的classstyletitle这些属性,对我们来说就没有意义了,它们就是噪点,在匹配过程中我们可以选择性的忽略它们(使用通配符进行匹配消耗掉它们),因此得到正则:<a [^>]*?href="([^"]+)"[^>]*>(.*?)</a> 数据,这个当然是指我们需要提取的内容了,如上面锚点举例,我们通过author=(.+)(.+)Zjmainstay部分数据进行了提取,因此,匹配结果的分组1(程序语言中的数组下标1)中,就能得到我们的结果。而对于多个数据的提取,如噪点举例,我们只需要针对数据部分进行多个分组(括号)的提取即可。 分组的计数,一般可以数左括号,排除环视和非捕获组的左括号,从1开始,依次加1递增,1,2,3,4....n,不同语言最大分组个数不同,大家在使用过程中自行留意,不过一般用不了那么多分组。 理解了三段论的概念,我们在写正则的过程中,只需要将源串进行分割划分,根据目标数据确定锚点,过滤噪点,提取数据,就能得到我们想要的正则了。