前言
在博客toSring方法的测试问题与利用正则表达式的解决方案中提到了正则表达式,此处简单的做一下总结一下。注:此博客仅总结正则表达式,直接按正则表达式的规则书写,如xy的连接中间不写括号。
目录
常用运算符
's'
,将s视作单个字符(s可能是个字符串)- 一元运算符
x?
,x出现一次或不出现x+
,x出现一次或多次x*
,x出现零次或多次x{3}
,x出现3次x{1,3}
,x出现一次或三次x{,4}
,x出现至多四次(可以为0次)x{2,}
,x出现至少两次- 代表出现次数的一元运算符后可以跟 { 空 , ? , + } \{空,?,+\} {空,?,+},分别代表Greedy(贪婪的),Reluctant(勉强的),Possessive(独占的)三种不同的匹配方式。
- 二元运算符
xy
,xy的连接x|y
,xy的并
- 多元符
[一个字符集合]
,代表集合中任意一个字符,如[aeiou]
[a-z]
,可以使用-表示区间[\^a-c]
,^代表不包含的意思,此处为所有不是abc的字符、[a-d[m-p]]
,两个集合的并,等价于[a-dm-p]
[a-z&&[^bc]]
,两个集合的交,等价于[ad-z]
一些特殊字符
.
:代表任意一个字符(有时能匹配换行符,有时不能,视实现正则表达式的库决定)\d
:代表任意的数字,与[0-9]等价\D
:任意非数字字符,等价于[^0-9]
\s
:代表任意的空白符,包括空格、tab、换行\S
:\s
的非\w
:代表任意可能出现在一个word中的字符,包括下划线,等价于[a-zA-Z_0-9]\W
:\w
的非
java中如何使用正则表达式
String类中有一些方法会用到正则表达式
主要讲解一下会用到的类java.util.regex.Pattern
Pattern对象是对正则表达式编译后得到的结果,主要用于用正则表达式提取出字符串中的一部分,如以下代码:
String s = "2020-03-18";
Pattern regex = Pattern.compile("(?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2})");
Matcher m = regex.matcher(s);
if (m.matches()) {
String year = m.group("year");
String month = m.group("month");
String day = m.group("day");
// Matcher.group(name) returns the part of s that matched (?<name>...)
}
其中的(?<name>regex)
代表一个表达式regex,在匹配的同时会将结果保存在名为name的一个区域,这被称作 named capturing groups。
使用Pattern.matcher(s)获得格式串对字符串s的匹配结果,会返回一个Matcher类对象,Matcher对象利用Pattern对象对输入字符串进行解析。
之后可用Matchers.matches()判断是否匹配成功,用Mathcers.group(name)获取与格式串中标记为name的表达式相匹配的字符串,如上方代码会获得结果:
year="2020"
month="03"
day="18"
转义符\\和\的区别
\在正则表达式中和在java的字符串中都代表转义,但是有所不同,正则表达式中转义的作用为不将\后面的字符看作特殊字符,比如.
在正则表达式中代表任意单个字符,\.
就代表字面意义上的.
而在java中的转义目的是把常规的内容解释为非常规的特殊字符,比如\n解释为字符串换行
java中正则表达式解释的顺序为先用java的语法将以双引号形式初始化的String变为由符号组成的字符串,再将这个字符串按照正则表达式的规则进行解释。
如\\.
的目的是在java中转义一次,第一个\防止第二个\被解释为特殊字符(比如\n中的\),如果将一个被初始化为"\\."
的字符串打印出来,会得到\.
,第二个\会被正则表达式解释为转义,即此处代表字符意义上的.
而不是一个通配符。
总结一下就是\相当于转义了两次,第一次让java看,第二次让正则表达式看。