什么是正则

  1. 正则表达式本身就是一个字符串
  2. 正则表达式用于定义字符串规则
  3. 正则表达式被几乎所有编程语言接受,用于定义检验字符串规则
  4. 编译语言都提供了API实现字符串规则检查
  5. **简单的就是按照 正则表达式的规则 来匹配字符串内容是否匹配,成立则true,反之false
下面列出了所有的表达式语法:
编号 子表达式 匹配
1 ^ 匹配行的开头。
2 $ 匹配行的结尾。
3 . 匹配除换行符之外的任何单个字符,使用m选项也可以匹配换行符。
4 [...] 匹配括号中的任何单个字符。
5 [^...] 匹配括号内的任何单个字符。
6 \A 整个字符串的开头。
7 \z 整个字符串的结尾。
8 \Z 除允许的最终行终止符之外的整个字符串的结尾。
9 re* 匹配前面表达式的0次或更多次出现。
10 re+ 匹配前面表达式的1次或更多次出现。
11 re? 匹配前面表达式的01次出现。
12 re{n} 准确匹配前面表达式的n次出现次数。
13 re{n,} 准确匹配前面表达式的n次以上出现次数。
14 aΙb 匹配ab
15 (re) 对正则表达式进行分组并记住匹配的文本。
16 (?: re) 将正则表达式分组而不记住匹配的文本。
17 (?> re) 匹配独立模式而无需回溯。
18 \w 匹配单词字符。
19 \W 匹配非单词字符。
20 \s 匹配空白符,相当于:[\t\n\r\f]
21 \S 匹配非空白。
22 \d 匹配数字,相当于:[0-9]
23 \D 匹配非数字。
24 \A 匹配字符串的开头。
25 \Z 匹配字符串的结尾。如果存在换行符,则它在换行符之前匹配。
26 \z 匹配字符串的结尾。
27 \G 匹配最后一个匹配结束的点。
28 \n 反向引用以捕获组号:n
29 \b 在括号外部匹配单词边界,在括号内匹配退格(0x08)。
30 \B 匹配非字边界。
31 \n,\t 匹配换行符,回车符,制表符等。
32 \E 转义(引用)所有字符直到\E
33 \Q 结束以\Q开头引用。

字符串の切割:split()

对字符串进行切割就是对一个字符串按照某个或某些字符进行切割,从而变成若干字符串。如“张三、李四、王五”,我们如果按照“、”来切割就变成三个字符串:“张三”,“李四”,“王五”。(切割的实质其实就是先进行字符串匹配,将匹配到的字符串“丢弃”,并将丢掉的前面部分和剩下的部分变成字符串)。

  练习1:对字符串“张三@@@李四@@王五@茅台”进行切割,去掉@符号。

    分析:首先我们要去掉字符串中的若干个@符号,如果只有一个@符号我们可以用直接用@来匹配,但这里的@是不确定的,所以我们要用到规则中的:

 

如上正则规定了, 目标字符串一共10个字符, 第一个是H, 第二个是e ...

字符集

用于约定一个位置上的字符范围

语法:

[0123456789]  表示一个位置上的字符范围是 0123456789 之中的某个字符
[0-9]
[abcdef]
[a-f]
[0-9a-z]

预定义字符集:

\d  等价于 [0-9] 
\w  等价于 [0-9a-zA-Z_]
\s  任何一个 空白
.   任何一个 字符

例子:

[0123456789]A  可以匹配 0A 1A 2A 3A ... 9A
匪兵[甲乙丙丁]  可以匹配 匪兵甲 匪兵乙 ...

特殊字符

特殊正则表达式字符,需要利用转义字符匹配

特殊符号  正则   Java

.         \.     \\.
[         \[     \\]
]         \]     \\[
\         \\     \\\\
?         \?     \\?
+         \+     \\+
...

案例: 检查一个字符串是否符合 邮政编码(6个数字) 规则

[0-9][0-9][0-9][0-9][0-9][0-9]
\d\d\d\d\d\d

数量词

约束左侧一个字符出现的次数

语法:

X{n}  表示左侧X必须出现n次
X{n,m} 表示左侧X至少出现n次, 最多出现m个
X{n,}  表示左侧X至少出现n次, 最多不限
X? 等价 X{0,1} 表示左侧X可以有可以没有
X+ 等价 X{1,}  表示左侧X至少有一个
X* 等价 X{0,}  表示左侧X可以没有或很多 

例子:

0{3}  表示0必须出现3个 
\d{6} 表示\d必须出现6个
\w{6,10} 表示单词字符出现6到10个(常见的用户名规则)

\+86\s*\d{11}

+86 15601035818
+8615601035818

分组 ()

  1. 将一组正则规则作为一个整体看待
  2. 分组中可以使用|实现或的关系

手机号:

+86 15601035818

设计正则:

(\+86)?\d{11}

手机号:

+86 15601035818
0086 15601035818

规则

(\+86|0086)?\s?\d{11}