限定符(量词):
*表示零次或多次,+表示至少一次,?表示最多一次。{n}表示n次,{n,}表示至少n次。
中括号表达式:
[]表示或. 如[afg]表示一个为a或者f或者g的字母。
中括号内的-表示范围。[0-9]表示数字0到9中的一个,[0-9]+表示至少一个数字。
[A-Za-z]表示一个任意字母。[A-Za-z]+表示任意多个字母。
中括号内的^表示非。[^xyz]表示任意不包含xyz的字符。比如123,abc之类的。
中括号表达式的匹配示例如下:
String str="abdf1459";
//匹配4个小写字母,接着是4个数字
String regex="[a-z]{4}[0-9]{4}";
if (str.matches(regex)) {
System.out.println(true);
}
此处的str.matches(regex)相当于:
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
if(m.matches()){
//...
}
中括号表达式的替换示例如下:
String test="123xyz456abc";
//将xyz和abcd这些字母,都替换成0
//String result = test.replaceAll("[x-za-d]", "0");
//将所有的非数字,都替换成0
String result = test.replaceAll("[^0-9]", "0");
System.out.println(result);
小括号
(xyz) 字符组,按照确切的顺序匹配字符xyz。
元字符:
- .
.可以匹配除换行符之外的任何单字符。比如.*表示任意个非换行符 的字符。
String str="abcdddabc";
// .*c+.*则表示以任意非换行符
开始,中间包含至少一个c字符,并且以任意非
字符结束。
String regex=".*c+.*";
if (str.matches(regex)){
System.out.println(true);
}
- |
| 表示或。
比如 x|y ,可以匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
- ^和$
^匹配字符串的开始位置。而$匹配字符串的结尾位置。
^cat : 验证该行以c开头紧接着是a,然后是t。
cat$ : 验证该行以t结尾倒数第二个字符为a倒数第三个字符为c。
^cat$ : 以c开头接着是a->t然后是行结束:只有cat三个字母的数据行。
匹配的示例,如下所示:
String str="catdog";
//regex只能匹配cat
String regex="^cat$";
//regex2可以匹配cat开头的字符串
//.*表示任意个非换行符
的字符
String regex2="^cat.*";
//regex3可以匹配dog结尾的字符串
String regex3=".*dog$";
boolean isMatch1=str.matches(regex);
boolean isMatch2=str.matches(regex2);
boolean isMatch3=str.matches(regex3);
System.out.println(isMatch1+","+isMatch2+","+isMatch3);
替换的示例,如下:
public static void replaceEnd() {
String test = "123.456.789....";
//替换掉末尾的点号
//[.]表示匹配符号点. 而+号表示至少一个,$表示末尾位置。如果去掉了$,那么所有的点号都会被替换掉。
String result = test.replaceAll("[.]+$", "");
//结果为123.456.789
System.out.println(result);
}
- d
由于元字符一般会放在字符串中,所以需要转义,也就是会变成 \ ,而d在字符串中会变成\d。
d表示一个整数,d{4}表示4个整数,d+表示任意个整数。D+表示任意个非整数
d{4}-d{2}-d{2}表示年月日,比如2016-05-05 。
匹配示例如下:
String str="2016-05-05";
String regex="\d{4}-\d{2}-\d{2}"
if (str.matches(regex)){
System.out.println(true);
}
替换示例如下:
String test="123abc45def";
//替换掉所有数字
String result=test.replaceAll("\d","");
//结果为替换后的结果为 "abcdef"
System.out.println(result);
- s
s表示一个空白字符(如空格、制表符、换页符等等),s+表示任意多的空白字符。
String regex="\s"
- S
S表示任何一个非空白字符。S+表示任意多的非空白字符。
String regex="\S"
- p
p{Upper}{2}表示2个大写字母。p{Lower}{3}表示3个小写字母。
String regex="\p{Upper}{2}\p{Lower}{3}\d{4}"
- w
w 匹配字母或数字或下划线或汉字 - W
W 不匹配字母或数字或下划线或汉字
匹配/替换特殊字符:
在正则表达式中,想要匹配+[.?^{|这些特殊字符,需要在前面加上一个 。
比如通过 . 去匹配.号,用\\去匹配。
当然,也可以直接放到中括号里面,比如[.]就相当于"\."
简单的替换特殊字符,如下:
public static void replaceStr() {
String test="123\456.789";
String result = test.replaceAll("\\", "").replaceAll("\.", "");
//结果为123456789
System.out.println(result);
}
正则表达式中包含特殊字符的示例,如下:
public static void replaceStr() {
String test="123$456\$789$123";
//替换所有的$,但是不替换$
//"[^\\]\$",中括号内的^表示非,而\\表示特殊字符,[$]表示符号$
System.out.println(test.replaceAll("[^\\][$]",""));
//结果为 12456$78123
}
前瞻,后顾,负前瞻,负后顾
A(?=B) 前瞻(Look ahead positive):
匹配的是A,限制条件是A的后面是B,即AB。
(?<=B)A 后顾(Look behind positive ):
匹配表达式A,限制条件A的前面是B,即BA
A(?!B) 负前瞻(Look ahead negative):
顾名思义,该正则匹配A,限制条件是A后面不是B
(?<!B)A 负后顾(Look behind negative ) :
匹配表达式A,限制条件是A的前面不是B
常用正则表达式
- 正数或者小数,第一位不为零。
[1-9]+[0-9]*([.][0-9]+)?
参考资料:
https://www.runoob.com/regexp/regexp-syntax.html
读懂正则表达式
常用正则表达式大全
简单学习正则表达式