1. 元字符
1)”-”(连字符)是一个特殊的元字符,它只有出现在[和]之间的时候才是元字符。字符集以外的地方,”-”只是一个普通字符;
2)”^”的效果将作用于给定字符集合里的所有字符或字符区间,而不是仅限于紧跟在”^”字符后面的那一个字符或字符区间;
[^a-z]:排除小写字母。^a-z: a-z 开头字符串。
3)一般来说,当在字符集合里使用的时候,像”.”和”+”这样的元字符将被解释为普通字符,不需要转义,但转义了也没坏处。[\w.] 的效果与[\w\.]是一样的;
2 位置匹配
\b 匹配的是字符之间的一个位置,一边是单词(能被\w匹配的字母,数字和下划线),另一边是其他内容(能被\W匹配的字符)。
3 反向引用
指这些实体引用的是先前的子表达式(可以把反向引用想象成变量)。
3.1 替换操作
public static void testReplace() {
String dateStr = "313-555-1234\n248-555-9999\n810-555-9000";
System.out.println(dateStr.replaceAll("(\\d{3})(-)(\\d{3})(-)(\\d{4})","($1) $3-$5"));;
}
运行结果:
(313) 555-1234
(248) 555-9999
(810) 555-9000
4 环视
4.1 向前看
向前看模式的长度是可变的,其中可以包含”.”和”+”等量词,非常灵活。
public static void testLookahead() {
String str = "https://www.baiduo.com\nhttp://www.mail.com\nftp://forta.com";
Matcher matcher = Pattern.compile("\\w+(?=:)").matcher(str);
Matcher matcher1 = Pattern.compile("\\w+:").matcher(str);
while (matcher.find()) {
System.out.println(matcher.group());
}
System.out.println("--------------");
while (matcher1.find()) {
System.out.println(matcher1.group());
}
}
运行结果:
https
http
ftp
--------------
https:
http:
ftp:
“(?=)” 向前查看操作符。
4.2 向后看
向后看模式则只能是固定长度。
public static void testLookbehind() {
String goodsList = "apple: ¥6.34\n" +
"banner: ¥12.34\n" +
"orange: ¥21";
Matcher matcher = Pattern.compile("(?<=¥)[0-9.]+").matcher(goodsList);
while (matcher.find()) {
System.out.println(matcher.group());
}
}
运行结果:
6.34
12.34
21
“(?<=)” 向后查看操作符。
4.3 否定式环视
public static void testNavigate() {
String str = "I paid $30 for 5 apple";
Matcher matcher = Pattern.compile("\\b(?<!\\$)\\d+\\b").matcher(str);
while (matcher.find()) {
System.out.println(matcher.group());
}
}
运行结果:
5
(?<!) 否定式向后看,(?!) 否定式向前看 。