java中正则表达式的运用及示例
限定符(量词):
*表示零次或多次,+表示至少一次,?表示最多一次。{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。
元字符:
.
.可以匹配除换行符之外的任何单字符。比如.*表示任意个非换行符\n的字符。
String str="abcdddabc";
// .*c+.*则表示以任意非换行符\n开始,中间包含至少一个c字符,并且以任意非\n字符结束。
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开头的字符串
//.*表示任意个非换行符\n的字符
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
常用正则表达式
- 字母:
[A-Za-z]
- 中文:
\u4e00-\u9fa5
- 全角字符:
\uFF00-\uFFFF
- 正数或者小数,第一位不为零。
[1-9]+[0-9]*([.][0-9]+)?
- 以某个字符串开始,另一个字符串结束的正则表达式。
开始字符串.+.结束字符串
参考资料:
https://www.runoob.com/regexp/regexp-syntax.html
读懂正则表达式
常用正则表达式大全
简单学习正则表达式