Charseki's Blog

慢慢的,你总会发现,你的努力没有白费。

regex-quiz

背景介绍

如果罗列计算机软件领域的伟大发明,我相信绝对不会超过二十项,在这个名单当中,当然应该包括分组交换网络,Web,Lisp,哈希算法,UNIX,编译技术,关系模型,面向对象,XML这些大名鼎鼎的家伙,而正则表达式也绝对不应该被漏掉。

Base-00

元字符

元字符 描述
. 匹配除换行符以外的任意字符
\d 匹配数字, 等价于字符组[0-9]
\w 匹配字母, 数字, 下划线
\s 匹配任意的空白符(包括制表符,空格,换行等)
\b 匹配单词开始或结束的位置
^ 匹配行首
$ 匹配行尾

反义元字符

元字符 描述
\D 匹配非数字的任意字符, 等价于[^0-9]
\W 匹配除字母,数字,下划线之外的任意字符
\S 匹配非空白的任意字符
\B 匹配非单词开始或结束的位置
[^x] 匹配除x以外的任意字符

可以看出正则表达式严格区分大小写.

重复限定符

限定符共有6个, 假设重复次数为x次, 那么将有如下规则:

限定符 描述
* x>=0
+ x>=1
? x=0 or x=1
{n} x=n
{n,} x>=n
{n,m} n<=x<=m

字符组

[…] 匹配中括号内字符之一. 如: [xyz] 匹配字符 x, y 或 z. 如果中括号中包含元字符, 则元字符降级为普通字符, 不再具有元字符的功能, 如 [+.?] 匹配 加号, 点号或问号.

排除性字符组

[^…] 匹配任何未列出的字符,. 如: [^x] 匹配除x以外的任意字符.

多选结构

| 就是或的意思, 表示两者中的一个. 如: a|b 匹配a或者b字符.

括号

括号 常用来界定重复限定符的范围, 以及将字符分组. 如: (ab)+ 可以匹配abab..等, 其中 ab 便是一个分组.

转义字符

即转义字符, 通常* + ? | { [ ( ) ] } ^ $ . # 和 空白这些字符都需要转义.

操作符的运算优先级

  1. 转义符

  2. (), (?:), (?=), [] 圆括号或方括号

  3. *, +, ?, {n}, {n,}, {n,m} 限定符

  4. ^, $ 位置

  5. | “或” 操作

修饰符

javaScript中正则表达式默认有如下五种修饰符:

  1. g (全文查找), 如上述截图, 实际上就开启了全文查找模式.

  2. i (忽略大小写查找)

  3. m (多行查找)

  4. y (ES6新增的粘连修饰符)

  5. u (ES6新增)

Task-01

Task 1: Word Boundaries

1
Check if a string contains the word word in it (case insensitive).
image-20210727172904189

Task-02

Task 2: Capitalize

1
Use substitution to replace every occurrence of the word i with the word I (uppercase, I as in me). E.g.: i'm replacing it. am i not? -> I'm replacing it. am I not?. 
image-20210727172310521

Task-03

Task 3: Uppercase Consonants

1
With regex you can count the number of matches. Can you make it return the number of uppercase consonants (B,C,D,F,..,X,Y,Z) in a given string? E.g.: it should return 3 with the text ABcDeFO!. Note: Only ASCII. We consider Y to be a consonant!

分析:

1、由题可知从给定的字符串中返回大写的辅音字母,所以首先排除5个元音字符 A,E,I,O,U

2、字母 Y 是半元音、半辅音字母,理当排除,但题目中认为它是辅音字母,故不在排除范围内

image-20210728192213098

思考:从提示可知有更简洁的解法,貌似16个字符就能搞定。我从取反的角度来优化正则,最终只能控制在18个字符。

image-20210729022144739

2021-07-31 再次尝试优化,控制在17个字符:

image-20210731092803249

黔驴技穷,Google答案虽满足16个字符,但提交并未通过。。。

image-20210729022640016 image-20210729023619424

有知道最佳答案的大佬请联系我,红包感谢!

Task-04

Task 4: Retreive Numbers

1
Count the number of integers in a given string. Integers are, for example: 1, 2, 65, 2579, etc.
image-20210730152422702

Task-05

Task 5: Whitespaces

1
Find all occurrences of 4 or more whitespace characters in a row throughout the string.
image-20210730153723499

Task-06

Task 06: Broken keyboard

1
Oh no! It seems my friends spilled beer all over my keyboard last night and my keys are super sticky now. Some of the time whennn I press a key, I get two duplicates. Can you ppplease help me fix thhhis?

分析:

1、Since any key on the keyboard can get stuck,so i need use .

2、\1 in the regex means match whatever the 1st capturing group (.)matches

3、replacement in $1

image-20210730185153283

-------------本文结束感谢您的阅读-------------
听说打赏我的人,都进了福布斯排行榜。

欢迎关注我的其它发布渠道