软件构造 03 正则表达式


软件构造

regex(正则表达式学习)

使用正则表达式的好处有哪些?一个正则表达式就是一个描述规则的字符串,所以,只需要编写正确的规则,我们就可以让正则表达式引擎去判断目标字符串是否符合规则。

正则表达式是一套标准,它可以用于任何语言。Java标准库的java.util.regex包内置了正则表达式引擎,在Java程序中使用正则表达式非常简单。

1. 精确匹配

A 匹配指定字符 A
\u548c 匹配指定Unicode字符 "和"

2. 匹配任意字符

可以用 . 匹配一个任意字符。

3. 数字

\d 表示任意一个数字
\D 表示任意一个非数字字符

4. 其它部分转译模糊匹配规则:

\w
:a ~ z,A ~ Z,0 ~ 9,_
大小写字母,数字和下划线

\s
空格、Tab键 空格,Tab
\W
非\w

\S
非\s a,A,&,_,……

5. 多个字符的匹配规则:

A* 任意个数字符 空,A,AA,AAA,……
A+ 至少1个字符 A,AA,AAA,……
A? 0个或1个字符 空,A
A{3} 指定个数字符 AAA
A{4,5} 指定范围个数字符 AAAA,AAAAA
A{2,} 至少n个字符 AA,AAA,AAAA,……

6. 匹配一个指定范围得字符

我们用[]表示匹配一个该范围内的指定字符

[0-9] 匹配一个0-9的数字字符
或者这样:[123456789]

[a-f] 匹配a-f的所有字母一个

[0-9a-fA-F] 可以匹配:
0-9:字符0~9;
a-f:字符a~f;
A-F:字符A~F。

7. 或规则 |

|连接的两个正则规则是或规则,例如,AB|CD表示可以匹配AB或CD。

8. 分组

现在我们想要匹配字符串learn java、learn php和learn go怎么办?一个最简单的规则是learn\sjava|learn\sphp|learn\sgo,但是这个规则太复杂了,可以把公共部分提出来,然后用(...)把子规则括起来表示成learn\s(java|php|go)。

(...)还有一个重要作用,就是分组匹配
分组的重大意义在于我们可以直接通过正则表达式的规则提取出我们想要的一个子串

例如在java中:
java.util.regex包中,用Pattern.compile构造一个正则表达式规则对象,用Patter类的观察者方法匹配后获得一个Matcher对象,如果匹配成功,就可以直接从Matcher.group(index)返回想要的子串:

正则表达式用(...)分组可以通过Matcher对象快速提取子串:

group(0)表示匹配的整个字符串;
group(1)表示第1个子串,group(2)表示第2个子串,以此类推。

9. 如何匹配中文和中文字符?

匹配特殊中文字符如中文引号,直接使用精确匹配,把中文字符敲上即可
“|” 匹配中文引号
切记要区分中文符号与英文符号
如何模糊匹配来匹配任意汉字呢?

[\u4e00-\u9fa5]可匹配任意汉字
[\u4e00-\u9fa5]*可匹配任意个汉字
特别注意:如果是windows电脑,你匹配的那个汉字字符串需要是GBK编码的,否则会失败血泪教训!!!!
其余汉字特殊匹配请看这篇文章:https://zhuanlan.zhihu.com/p/266732210

10. java中也使用 \作为转义符号,所以在上面正则表达式用到转移符号的地方,在java中要在加一个\才能生成字符串中的\字符。

例如``` \d ```在java中是``` \\d ```。

最后附上几个帮助学习和分析正则表达式的网址:
https://jex.im/regulex/#!flags=&re=%5E(a%7Cb)*%3F%24
https://regexr.com/