1.Matcher 中的带参数的reset方法可以重复使用一个matcher ,提高效率。
2.在匹配模式前加?是懒惰模式,有的时候很有用
static Pattern pattern = Pattern.compile("(?<=角色{1,200})(?::.+?:)(\\d+)");
static String str = "角色:管理员:123,员工:张三:222,角色:经营部成员:1234,员工:汪宁:333";
public static void test(){
Matcher matcher = pattern.matcher(str);
while(matcher.find()){
System.out.println(matcher.start());
System.out.println(matcher.end());
System.out.println(matcher.group(1));
System.out.println("---------------------");
}
}
这里我要匹配123和1234 如果
(?::.+?:) 换成 (?::.+:) 就是贪婪模式 .+会尽可能匹配多的字符,这样的话
我得到的结果就永远只有最后一个。
3.(?:)这样的话这个括号的组不会被捕获
4.零度断言
(?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 |
(?!exp) | 匹配后面跟的不是exp的位置 |
(?<!exp) |
匹配前面不是exp的位置
|
5.appendReplacement
public static void cc(){
Matcher matcher = Pattern.compile("\\D+", Pattern.DOTALL).matcher("a1b3c4");
StringBuffer str = new StringBuffer();
while(matcher.find()){
matcher.appendReplacement(str, matcher.group()+"#");
System.out.println(matcher.group());
}
matcher.appendTail(str);
System.out.println(str.toString());
}
这里结果会变成a#1b#3c#4
这是一种比较高级的替换,比replace方法要更灵活。