正则表达式
今天对java基础部分进行了复习,同时对于关于正则表达式部分进行了总结。
一、正则表达式的基本用法
正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE)
作用: 专门用于字符串的操作。
特点: 用一些特定的符号来表达一些代码操作,以简化书写。(学习对特殊符号的使用)
好处: 可以简化对字符串的复杂操作。
弊端: 符号定义越多,正则越长,阅读性越差。
具体操作功能:
匹配: String中的 metches 方法, 用规则匹配整个字符串,只要有一处符号不匹配就会停止校验,返回false。
切割: String中的 split方法,使用规则查找整个字符串,找到匹配该规则的子串,并从此处切割。
替换: String中的 replaceAll,使用规则查找整个字符串,将符合规则的部分替换成指定字符串。
获取: 将字符串中符合规范的字符串取出:
步骤:
1、将正则表达式封装成对象。
如: Pattern p = Pattern.compile(regex);
2、让正则对象和要操作的字符串进行关联。
matcher(Charsequence input)
3、关联之后获取正则引擎。(与上步同时操作)
如: Matcher m = p.matcher(str);
4、通过引擎对符合规则的子字符串进行操作,如: 取出。
正则引擎中有许多操作方法:
匹配: boolean matches() 尝试将整个区域与模式匹配。
替换: String replaceAll(String replacement) 替换模式与给定替换字符串相匹配的输入序列的每个子序列。
查找: boolean find() 尝试查找与该模式匹配的输入序列的下一个子序列。
boolean find(int start) 重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。
返回: String group() 返回由以前匹配操作所匹配的输入子序列。
String group(int group) 返回在以前匹配操作期间由给定组捕获的输入子序列。
int start() 返回以前匹配的初始索引。
int start(int group) 返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引。
int end() 返回最后匹配字符之后的偏移量。
int end(int group) 返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。
思考方式:
只想要判断字符串的对错, 就要使用匹配。
只想要将已有的字符串改变成另一个字符串,使用替换。
只想要按照一定的方法将已有字符串变成几个字符串,使用切割。(获取规则之外的子串)
只想要获得符合规则的字符串的子串,使用获取。(获取规则之内的子串)
邮箱校验:"[a-zA-Z0-9_]+@[a-zA-Z0-9_]+(\\.[a-zA-Z]+){1,3}"
二、正则表达式的常用规则
字符
x 字符 x
\\ 反斜线字符
\0n 带有八进制值 0 的字符 n (0 <= n <= 7)
\0nn 带有八进制值 0 的字符 nn (0 <= n <= 7)
\0mnn 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7)
\xhh 带有十六进制值 0x 的字符 hh
\uhhhh 带有十六进制值 0x 的字符 hhhh
\t 制表符 ('\u0009')
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
\f 换页符 ('\u000C')
\a 报警 (bell) 符 ('\u0007')
\e 转义符 ('\u001B')
\cx 对应于 x 的控制符
字符类:
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
预定义字符:
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
边界匹配器:
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾
Greedy 数量词(还有其他的类型数量词)
X? X, 一次或一次也没有
X* X, 零次或多次
X+ X, 一次或多次
X{n} X, 恰好 n 次
X{n,} X, 至少 n 次
X{n,m} X, 至少 n 次,但是不超过 m 次
组和捕获
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
(组数从最左边的左括号开始定义)
1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
组零始终代表整个表达式。(使用时用 \\数字 代表再次使用的哪一组)
在其他字符串中获取前面正则表达式的 组: 使用 $ 加组数。
注意: 定义正则表达式是以字符串的形式(双引号内)定义的,所以, 要注意 \ 和转义字符的冲突性。
如在使用一些预定义字符 和 使用捕获组的使用, 本身就有反斜杠, 所以要在加一个反斜杠来 转义本来的反斜杠。