正则表达式(Regular Expression)用于搜索、编辑和操作字符串文本,从左到右匹配文本,每个源字符只匹配一次。
import java.util.regex.Matcher; import java.util.regex.Pattern;
目录
-
字符串内置正则处理方法
// 字符串内置正则处理方法
public static void RegExTest1() {
// matches() 当仅且当正则匹配整个字符串时返回 true
System.out.println("-----matches-----");
System.out.println("Regular".matches("Regular"));
System.out.println("Regular".matches("Regular "));
// replaceFirst() 替换首次匹配的字符串片段
System.out.println("-----replaceFirst-----");
System.out.println("Regex Regex_ Regex ".replaceFirst("\\w{6}", "First"));
System.out.println("Regex Regex_ Regex ".replaceFirst("\\w+\\s", "First"));
// replaceAll() 替换所有匹配的字符 不会改变原str,返回修改后的对象
System.out.println("-----replaceAll-----");
System.out.println("RegggexReggexReggggex".replaceAll("g{2,4}", "g"));
// split() 按匹配的正则表达式切片字符串
System.out.println("-----split-----");
for (String item : "Regex Regex R".split("\\s+")) {
System.out.println(item); // Regex Regex R
}
}
结果:
-----matches-----
true
false
-----replaceFirst-----
Regex First Regex
FirstRegex_ Regex
-----replaceAll-----
RegexRegexRegex
-----split-----
Regex
Regex
R
-
模式匹配 Pattern Matcher
// 模式匹配 Pattern Matcher
public static void RegExTest2() {
System.out.println("-----Pattern Matcher-----");
String str = "Regular , Expression. ";
Pattern pat = Pattern.compile("\\w+"); // 创建模式对象 匹配 Regular与Expression
Matcher mat = pat.matcher(str); // 创建匹配对象 匹配 str
while (mat.find()) {
System.out.print("Start Index: " + mat.start()); // 匹配关系 [start, end)
System.out.print(" End Index: "+ mat.end() + " ");
System.out.println(mat.group()); // 没有用()分组,默认打印$0
}
System.out.println("-----()-----"); // 添加小括号可以进行分组创建反向引用生成对应片段
System.out.println(str.replaceAll("(\\w+)(\\s*)([.,])(\\s*)", "$1$3"));
// Matcher.find(index) 查找下一个匹配的位置,可指定开始下标index
// 要先find(),找到后才有group()
// $0 匹配 `(\w+)(\s*)([.,])(\s*)` 结果为 `Regular空格,空格空格` 和 `Expression.空格`
// $1 匹配 `(\w+)` 结果为 `Regular` 和 `Expression`
// $2 匹配 `(\s*)` 结果为 `空格` 和 ``
// $3 匹配 `([.,])` 结果为 `,` 和 `.`
// $4 匹配 `(\s*)` 结果为 `空格空格` 和 `空格`
Pattern pat2 = Pattern.compile("(\\w+)(\\s*)([.,])(\\s*)");
Matcher mat2 = pat2.matcher(str);
mat2.find();
System.out.println("$0 : " + mat2.group());
System.out.println("$1 : " + mat2.group(1));
System.out.println("$3 : " + mat2.group(3));
System.out.println("-----(?:)-----");
// (?:) 小括号内以?:开头可以取消对应分组生成片段
System.out.println(str.replaceAll("(\\w+)(?:\\s*)([.,])(?:\\s*)", "$1$2"));
}
结果:
-----Pattern Matcher-----
Start Index: 0 End Index: 7 Regular
Start Index: 11 End Index: 21 Expression
-----()-----
Regular,Expression.
$0 : Regular ,
$1 : Regular
$3 : ,
-----(?:)-----
Regular,Expression.
-
基本语法实例
/*
* . 匹配所有单个字符,除了换行符(\r与\n)
* \w 匹配一个单词字符(大小写字母、数字、下划线)[a-zA-Z0-9]
* \s 匹配一个空格(缩进、换行、垂直tab、换页符)[ \t\n\x0b\r\f]
* + 匹配一个或多个
* [] 复选集 元素为或关系 里面的 ,. 自动转为普通字符
* () 分组 反向引用会保存匹配模式分组的字符串片段
* {} 个数
* \d 匹配数字0-9
* */
// 基本语法
public static void RegExTest3() {
// 字符串中 \n 表示回车,\\n 表示 "\n"
// 正则表达 . 表示字符,\\. 表示匹配"."
System.out.println("-----.\\s\\w-----");
System.out.println("Reg6!\n\rular".replaceAll("R.+", "_"));
System.out.println("Reg6!\n\nular".replaceAll("\\s", "_"));
System.out.println("Reg6!\n\rular".replaceAll("R\\w+", "_"));
// 数字范围匹配
System.out.println("-----^$-----");
// 使用^与$注意范围为字符串整体的开始和结尾
System.out.println(Pattern.compile("0$").matcher("1200\n1205").find()); // false
System.out.println(Pattern.compile("0$").matcher("1205\n1200").find()); // true
System.out.println("-----^$2-----");
String str = "1990 2021 2017 1995 2016";
Pattern pat = Pattern.compile("199[5-9]|20[0-1][0-6]|2017"); // 匹配1995-2017
Matcher mat = pat.matcher(str);
while (mat.find()) {
System.out.print(mat.group() + " ");
}
结果:
-----.\s\w-----
_
ular
Reg6!__ular
_!
ular
-----^$-----
false
true
-----^$2-----
2017 1995 2016