Regex 101

最近工作终于闲了下来,可以上班研究代码。遇到一些需要正则表达式的编程问题,无法解决所以决定个学一下。

Regex 101 - ZH-CN (regexlearn.com)

Regex Learn - 练习场

Regex Learn - cheatsheet

练习题

简单

匹配单词

he is in black.

1black

. 允许匹配任何字符,包括特殊字符和空格

A B C D E

1.

肯定字符集 [abc] 匹配字母可以用[a-z] 匹配数字可以用[0-9] 或者 \d

bar ber bir bor bur

1b[aeiou]r

否定字符集[^abc]

bar ber bir bor bur

1b[^ei]r

字母范围[a-z]

重复? + *

? 加在字母后代表出现0次或1次

colorcolour

1colou?r

+ 加在字母后代表出现1次或多次

br ber beer

1be+r

 * 加在字母后代表出现0次或多次

br ber beer

1be*r

大括号

{x}加在字母后代表出现x次

ber beer beeer beeeer

1be{2}r

{n, }加在字母后代表出现n到正无穷次,类似集合,[n,∞)

ber beer beeer beeeer

1be{3,}r

分组()

分组可以只抓取匹配到的字符中的一部分。(通常也可以全都获取到再replace)

file_record_transcript.pdf

1(.*).pdf$

在python种可以这样使用

1import re  
2txt = "The rain in Spain.pdf"  
3x = re.match("(^The.*).(pdf)$", txt)  
4print(x.group(1)) #The rain in Spain  
5print(x.group(2)) #pdf

() 分组可以把上面的重复符号给组用。而不只是一个字母。

\1,\2 分组引用,可以把组像变量一样引用。第一组就是\1

ha-ha,haa-haa

1(ha)-\1,(haa)-\2

像当于是:

1(ha)-(ha),(haa)-(haa)

(?: ): 非捕获分组 (不能被引用)

ha-ha,haa-haa

1(?:ha)-ha,(haa)-/1

转义字符 \

{ } [ ] / \ + * . $^ | ? 如果要这些特殊字符,需要在前面加上反斜杠匹配

匹配开头 ^

1. 3 eggs, beaten

2. 1 tsp sunflower oil

3. 1 tsp butter

1^[0-9]

匹配尾巴 $ 

html.html.html-da-sdfhtml

1html$

匹配字符 \w

字母、数字和下划线 \w,其他各种不在这范围内的 \W (匹配中文和中文标点可以使用\W)

数字\d,非数字\D

空白符\s,非空白\S

Lookarounds

官方中文翻译:零宽断言,我觉得这个翻译真的是误导人,“断言”:极其肯定地说,断言你妈,还零宽,就不说人话是吧。 应该叫:附近匹配/左右匹配。

其实我觉得如果后缀前缀不变的话,可以吧这段比如3PM一起给match出来,然后再replace PM 就可以了,比这个奇怪的语法看起来要好一些。

看看后面(指定尾缀)

Date: 4 Aug 3PM

1\d+(?=PM)

后面不要!(指定不要的尾缀)

Date: 4 Aug 3PM

1\d+(?!PM)

看看前面

Product Code: 1064 Price: $5

1(?<=\$)\d+

前面不要!

Product Code: 1064 Price: $5

1(?<!\$)\d+

全局标志/gmi

g - 获取全部,不加上只获取第一个

m - 多行,如果不开启则全部文本视作一行,对于有匹配文本末端$的有影响

i - 大小写不在意,不加上则大小写敏感

贪婪匹配

正则表达式默认执行贪婪匹配,能要长的就不要短的

ber beer beeer beeeer

1.*r

懒惰匹配? 还记得吗,?代表出现0次或1次

ber beer beeer beeeer

1.*?r

Vscode技巧
C# 的打包技巧(打包成singlefile)