活到老学到老,正则就是学不好,学不好学不好,拿起笔笔把它记好!
Pattern.DOTALL
单行模式,同(?s)表达式,作用是更改(.)的含义,默认情况下(.)不会匹配换行符(\n),设置了Pattern.DOTALL模式就会匹配换行符(\n)。
默认不会匹配换行符(\n)
java
public static void main(String[] args) {
//表达式(.)默认不会匹配换行符(\n)
Pattern pattern = Pattern.compile("<.+>");
Matcher matcher = pattern.matcher("<a href=\"index.html\">\n<a href=\"index.html\">");
System.out.println(matcher.replaceAll("替代字符串"));
}
输出:
java
替代字符串
替代字符串
设置Pattern.DOTALL模式后,表达式(.)会匹配换行符(\n)
java
public static void main(String[] args) {
//设置Pattern.DOTALL模式后,表达式(.)会匹配换行符(\n)
Pattern pattern = Pattern.compile("<.+>",Pattern.DOTALL);
Matcher matcher = pattern.matcher("<a href=\"index.html\">\n<a href=\"index.html\">");
System.out.println(matcher.replaceAll("替代字符串"));
}
输出:
java
替代字符串
Pattern.DOTALL模式也可以用(?s)代替,将(?s)加到正则表达式前面,表达式(.)会匹配换行符(\n)
java
public static void main(String[] args) {
//Pattern.DOTALL模式也可以用(?s)代替,将(?s)加到正则表达式前面,表达式(.)会匹配换行符(\n)
Pattern pattern = Pattern.compile("(?s)<.+>");
Matcher matcher = pattern.matcher("<a href=\"index.html\">\n<a href=\"index.html\">");
System.out.println(matcher.replaceAll("替代字符串"));
}
输出:
java
替代字符串
Pattern.MULTILINE
多行模式,同(?m)表达式,作用是匹配多行目标,例如(^)和($)默认情况下只匹配开始和结尾,设置了Pattern.MULTILINE模式后,如果字符串是多行内容,则会匹配每一行的目标。
表达式(^)($)默认情况下只匹配开始和结尾
java
public static void main(String[] args) {
//表达式(^)($)默认情况下只匹配开始和结尾
Pattern pattern1 = Pattern.compile("^<");
Pattern pattern2 = Pattern.compile(">$");
Matcher matcher1 = pattern1.matcher("<aaaa>\n<bbbb>");
Matcher matcher2 = pattern2.matcher("<aaaa>\n<bbbb>");
System.out.println(matcher1.replaceAll("替代字符串"));
System.out.println(matcher2.replaceAll("替代字符串"));
}
输出:
java
替代字符串aaaa>
<bbbb>
<aaaa>
<bbbb替代字符串
设置Pattern.MULTILINE后,表达式(^)($)作用于多行
java
public static void main(String[] args) {
//设置Pattern.MULTILINE后,表达式(^)($)作用于多行
Pattern pattern1 = Pattern.compile("^<",Pattern.MULTILINE);
Pattern pattern2 = Pattern.compile(">$",Pattern.MULTILINE);
Matcher matcher1 = pattern1.matcher("<aaaa>\n<bbbb>");
Matcher matcher2 = pattern2.matcher("<aaaa>\n<bbbb>");
System.out.println(matcher1.replaceAll("替代字符串"));
System.out.println(matcher2.replaceAll("替代字符串"));
}
输出:
java
替代字符串aaaa>
替代字符串bbbb>
<aaaa替代字符串
<bbbb替代字符串
Pattern.MULTILINE模式也可以用(?m)代替,将(?m)加到正则表达式前面,表达式(^)($)作用于多行
java
public static void main(String[] args) {
//Pattern.MULTILINE模式也可以用(?m)代替,将(?m)加到正则表达式前面,表达式(^)($)作用于多行
Pattern pattern1 = Pattern.compile("(?m)^<");
Pattern pattern2 = Pattern.compile("(?m)>$");
Matcher matcher1 = pattern1.matcher("<aaaa>\n<bbbb>");
Matcher matcher2 = pattern2.matcher("<aaaa>\n<bbbb>");
System.out.println(matcher1.replaceAll("替代字符串"));
System.out.println(matcher2.replaceAll("替代字符串"));
}
输出:
java
替代字符串aaaa>
替代字符串bbbb>
<aaaa替代字符串
<bbbb替代字符串
Pattern.CASE_INSENSITIVE
忽略大小写,同(?i)表达式,顾名思义其作用就是忽略字母大小写。
java
public static void main(String[] args) {
//Pattern.CASE_INSENSITIVE模式忽略英文字母大小写
Pattern pattern = Pattern.compile("a+",Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("<aaAA>");
System.out.println(matcher.replaceAll("替代字符串"));
}
输出:
java
<替代字符串>
(.+)
贪婪模式,最长跨度匹配,相当于先扫描全文再匹配。
java
public static void main(String[] args) {
//(.+)模式表示贪婪匹配,最长跨度匹配
Pattern pattern = Pattern.compile("a.+c");
Matcher matcher = pattern.matcher("<abcabc>");
System.out.println(matcher.replaceAll("替代字符串"));
}
输出:
java
<替代字符串>
(.+?)
惰性模式,最小跨度匹配,相当于从全文开头扫描,命中一个算一个。
java
public static void main(String[] args) {
//(.+?)模式表示惰性匹配,最短跨度匹配
Pattern pattern = Pattern.compile("a.+?c");
Matcher matcher = pattern.matcher("<abcabc>");
System.out.println(matcher.replaceAll("替代字符串"));
}
输出:
java
<替代字符串替代字符串>