正则表达式用于匹配、校验字符串。
正则表达式语法
符号 | 描述 |
---|---|
. | 小数点,可匹配\n之外的任何一个字符,要匹配小数点,用\. |
x | x是某一具体字符,表示匹配该字符 |
\d | 匹配0-9之间的一个数字 |
\D | 匹配\d之外的任一个字符 |
\s | 匹配任一个空白,包括空格、制表符、回车符、换行符 |
\S | 匹配\s之外的任一个字符 |
\w | 匹配任一个单词字符,包括数字0-9,英文字母大写26个、小写26个,下划线_ |
\W | 匹配\w之外的任一个字符 |
\t | 匹配空格、Tab之类的空白符 |
\n | 换行符 |
\r | 回车符 |
以上式子均只匹配一个字符
符号 | 描述 |
---|---|
\ | 转义,匹配正则表达式中的预定义的符号,例:\\匹配一个\, \(匹配一个(, \?匹配一个? |
| | 2项中选择一项,或,例:ab|c表示匹配ab或ac |
() | 作为整体看待 |
中括号
符号 | 描述 |
---|---|
[ ] | 匹配指定范围中的任一个字符,例:[abc]表示匹配a、b、c中的任一个字符。 |
- | 连续范围,例:[a-z]表示匹配所有小写字母中的任一个字符,[\u4e00-\u9fa5]表示匹配任意一个中文字符 |
^ | 非,例:\[\^a-d] 表示匹配a、b、c、d之外的任一个字符。^会把后面的部分作为一个整体,eg. [^a-zA-Z0-9!*@-] ,会把 a-zA-Z0-9!*@- 作为一个整体 |
&& | 交集,例:[a-d&&c-z] 相当于[cd],匹配c、d中的任一个字符 |
中括号只匹配一个字符
位置限定
符号 | 描述 |
---|---|
^ | 行的开头,放在该部分前面,例:^H 表示匹配H,H要是一行的开头 |
$ | 行的结尾,放在该部分的后面,例:o$ 表示匹配o,o要是一行的结尾 |
\b | 单词的边界,前边界就放在该部分的前面,后边界就放在该部分的后面。 例:\bH 表示匹配H,H要是单词的开头;H\b表示匹配H,H要是单词的结尾。 |
\B | 不是单词的边界。不是前边界就放在该部分的前面,不是后边界就放在该部分的后面。 例:\BH 表示匹配H,H不能是单词的开头;H\B表示匹配H,H不能是单词的结尾。 |
以上均是对一个字符、子表达式位置的说明。
数量限定
符号 | 描述 |
---|---|
* | >=0,至少0个 |
+ | >=1,至少1个 |
? | 0个或1个 |
{m} | m个 |
{m,} | 至少m个 |
{m,n} | 至少m个,至多n个 |
限定的是前一个字符、子表达式出现的次数
数量匹配模式
1、Greedy 贪婪模式
数量限定符默认采用贪婪模式,尽可能多的匹配字符,示例
# 能匹配5个就匹配5个,不行就4个,再不行就3个...
\w{2,5}
# ?表示匹配0个或1个,会优先匹配1个,没有才匹配0个
\w?
# +表示匹配1个及以上,优先匹配最多个
\w+
2、Reluctant 勉强模式
尽可能少的匹配字符,也称最小匹配模式,需要在数量限定符后用一个额外的?来表示该数量限定符使用最小匹配模式,示例
# 优先匹配2个
\w{2,5}?
# ?匹配0或1个,优先匹配0个
\w??
# +匹配1个及以上,优先匹配1个
\w+?
3、Possessive 占有模式
在数量限定符后面用一个额外的+来表示该部分使用占有模式,这个不常用。
在java中使用正则表达式
两种方式
- 使用String类的方法
- 使用Pattern+Matcher两个类
使用String类的方法
//整串匹配,整个字符串符合regex才算匹配
boolean matches(String regex)
//替换第一个匹配的串
String replaceFirst(String regex, String replacement)
//替换所有匹配的串
String replaceAll(String regex, String replacement)
//替换所有匹配的串,但只能直接指定字符串,不能使用正则表达式
String replace(String target, String replacement)
//以regex作为切割符,把字符串切割为数组
String[] split(String regex)
- 替换操作,原串不变,以新串形式返回
- 字符串形式的regex,正则表达式不用放在/ /中,直接写即可,但正则表达式预定义的字符要用\转义。
示例
//true
"hello".matches("hello")
//false
"hello".matches("he")
//把所有的hello换为Hello
str = str.replaceAll("hello", "Hello");
//去除中文字符
str = str.replaceAll("[\u4e00-\u9fa5]", "");
//把所有的连词线-换为下划线_
str = str.replaceAll("\\-", "_");
//把所有的\替换为/
str = str.replaceAll("\\\\", "/");
对String、正则表达式,\都是特殊字符、需要转义,\在正则表达式中转义写为\\,\\写成String形式还需要转义,写成\\\\
使用Pattern+Matcher两个类
// 获取正则表达式对象
Pattern p=Pattern.compile(String regex);
// 创建Matcher对象,参数指定要匹配的字符串
Matcher m=p.matcher(String str);
// 用Matcher对象来操作
boolean b=m.matches(); //整串匹配
boolean b=m.find(); //匹配子串
String str=m.replaceFirst(String replacement); //用指定字符串替换第一个匹配
String str=m.replaceAll(String replacement); //用指定字符串替换所有匹配
注意点
1、本来匹配正则表达式中预定义的符号要转义,比如匹配? 要写成 \? ,
但java把正则表达式作为字符串放在双引号中,需要转义\,比如 \w => “\\w”,
其它预定义的符号,比如?、+、()、[ ]等等,不需要再用\转义。
2、一些方法的参数是Sring regex,因为正则表达式中可能有转义的特殊字符,和使用普通字符串有所区别。
示例:String原生的 split(Sring regex) 方法
String separator = "|";
String str = "A" + separator + "B";
// 错误用法,结果:[A, |, B]
String[] split1 = str.split(separator);
// 正确用法:|是正则表达式中的特殊字符,要用\转义,\自身也是特殊字符,再用\转义。结果:[A, B]
String[] split2 = str.split("\\|");
//或者使用lang3提供的 StringUtils.split(String, String),参数都是普通字符串
String[] split3 = StringUtils.split(str, "|");