这里不讲基本的正则字符,只说一下Java中使用正则的常用API
基本代码,后面的基于他们
// 构建正则
Pattern pattern = Pattern.compile("((\\d)(\\d))");
// 匹配字符串
Matcher matcher = pattern.matcher("23sgfew8h8erh23gewjrg3er");
判断匹配
// 注意这里判断的是整个字符串是否匹配
System.out.println(matcher.matches());
// 判断开头是否匹配
System.out.println(matcher.lookingAt());
分组概念
先左边后右边,若有嵌套,先外面再里面
例如((a)(b))(d)
分组0为全部即:abd
分组1为:ab
分组2为:a
分组3为:b
分组4为:d
查找分组
// 从指定下标开始寻找会移动查找指针 默认空参的从下标0开始找
System.out.println(matcher.find(12));
// 恢复查找指针
matcher.reset();
while (matcher.find()){//寻找局部匹配 多次调用会自动后移指针 可以这样获取全部匹配子串
// 获取匹配的整体子串 与matcher.group(0)等价 底层调用的就是
System.out.println(matcher.group());
// 获取匹配整体子串的开始与结束下标
System.out.println(matcher.start()+"-"+matcher.end());
// 获取分组数
System.out.println(matcher.groupCount());
// 获取指定分组的内容
System.out.println(matcher.group(1));
// 获取指定分组的开始与结束下标
System.out.println(matcher.start(1)+"-"+matcher.end(1));
}
替换操作
都可以使用$num引用分组
//全部替换
String s = matcher.replaceAll("NUM-$1");
//只替换第一个
String s1 = matcher.replaceFirst("NUM-$1");
引用前文
若想判断前后一致可以使用\num引用前面的分组(注意\转义问题)
例如需要找 n-n 的字符串 n必须相同且是一个数字
Pattern compile = Pattern.compile("(\\d)-\\1");
拼接操作(常用)
Map<String,String> map=new HashMap<>();
map.put("name","博丽灵梦");
map.put("age","16");
Pattern pattern = Pattern.compile("\\$\\{(\\w+)}");
Matcher matcher = pattern.matcher("My Name Is ${name} My Age Is ${age}!");
// 注意拼接必须是 StringBuffer
StringBuffer buffer=new StringBuffer();
while (matcher.find()){
// 获取${}的内容并进行替换
String s = map.getOrDefault(matcher.group(1), "UN_KNOWN");
// 拼接这次指针移动的部分 s为额外附加的 可以使用$num引用这次匹配的分组
matcher.appendReplacement(buffer,s);
}
// 附加指针后的全部内容
matcher.appendTail(buffer);
System.out.println(buffer);//输出 My Name Is 博丽灵梦 My Age Is 16!
几种常用模式
Pattern.compile(rex,MODE);
MODE取值:
Pattern.CASE_INSENSITIVE//不区分大小写匹配
Pattern.COMMENTS//忽略空白行与#整行注释
Pattern.DOTALL// 指定 . 可以匹配任意字符 默认无法匹配行终止符