Pattern.DOTALL模式即Singleline(单行模式):(?s)。表示更改.的含义,使它与每一个字符匹配(包括换行 符\n),默认情况下, 正则表达式中点(.)不会匹配换行符, 设置了Pattern.DOTALL模式, 才会匹配所有字符包括换行符。
Pattern.MULTILINE模式即Multiline(多行模式):(?m)。正则表达式中出现了^或者$, 默认只会匹配第一行. 设置了Pattern.MULTILINE模式,会匹配所有行。表示更改^和$的 含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。
(?i)即匹配时不区分大小写。表示匹配时不区分大小写。
(.+)默认是贪婪匹配,最大匹配
(.+?)为惰性匹配,最小匹配
package test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test5 {
public static void main(String[] args) throws Exception { String s = "12a干扰\r\n干扰b3";// 想删除ab之间的字符 String replaceAll = s.replaceAll("a.+?b", ""); System.out.println(replaceAll);// 结果:12a干扰\r\n干扰b3 // 上面没有得到正确的结果是因为.不会匹配换行符 String replaceAll2 = s.replaceAll("(?s)a.+?b", "");// 在正则表达式行首加上(?s)成为单行模式 System.out.println(replaceAll2);// 结果:123 // 取ab之间的值方式 Pattern p = Pattern.compile("a.+?b", Pattern.DOTALL); Matcher m = p.matcher(s); while (m.find()) { System.out.println(m.group());// 结果:a干扰\r\n干扰b } }
}
后向引用$1
修改"QQ:123456。"中的数字
public static void main(String[] args) {
//修改QQ:123456。中的数字
String s1 = "QQ:123456。";
Pattern p = Pattern.compile("(QQ:)(\d+)(。)");
Matcher m = p.matcher(s1);
while (m.find()) {
System.out.println(m.group(1));//QQ:
System.out.println(m.group(2));//123456
System.out.println(m.group(3));//。
}
s1 = s1.replaceAll("(QQ:)(\d+)(。)", "$199999$3");
System.out.println(s1);
}
去除单行注释、去除多行注释、去除空行
String line = "12\r\n\r\n\n\n\n3";
line = line.replaceAll("(?s)/\.?\/","");//去除多行注释/**/line = line.replaceAll("(?s)","");//去除多行注释
line = line.replaceAll("(.?)(//.)","$1");//去除单行注释//
line = line.replaceAll("\s*\n","\r\n");//去除空行