- 正则表达式: 即通过一些特定的符号操作字符串数据
- 特点: 简化了书写,但是阅读性较差
- 位于 java.util.regex 包中
匹配规则
正则表达式对字符的常见操作
// 1. 匹配,
// 其实使用的就是 String 类中的 matches(String regex) 方法
// 2. 切割
// 其实使用的就是 String 类中的 split 方法
// 示例一
String str = "zhangsan.xiaoqiang.zhaoliu";
String[] name = str.split("\.") // 其中 \ 是对 进行转义
// 示例二
String str = "zhangsanttttxiaoqiangmmmmmzhaoliu";
String[] name = str.split("(.)\1+"); // 正则中的封装使用 (),
// tttt 中第二个字符复用第一个字符
// 3. 替换
// 其实使用的就是 String 类中的 replaceAll(String regx, String replacement) 方法
// 示例一: 将字符串中的叠词替换为一个
String str = "zhangsanttttxiaoqiangmmmmmzhaoliu"
str = str.replaceAll("(.)\1+","$1"); // $ 表示引用正则表达式中的第一组内容
// 4. 获取
// 正则表达式对应的类 Pattern
// 4.1 首先将正则规则封装成对象
// 4.2 通过正则对象得到 Matcher(匹配器) 对象
// 4.3 通过匹配器对象的方法对字符串进行操作.
// 示例: 获取下列字符串中字符长度为 3 的字符串
String str = "da jia hao,ming tian bu fang jia!";
// 定义规则
String regex = "\b[a-z]{3}\b"; // 其中 \b 表示单词边界
// 将正则规则封装成对象
Pattern p = Pattern.compile(regex);
// 通过正则对象的 matcher 方法与字符串相关联, 获取匹配器对象 Matcher
Matcher m = p.matcher("str");
// 使用 matcher 对象的方法对字符串进行操作
// 既然获取三个字母所组成的单词
// 即查找, 使用 find() 方法, 该方法只能查找一次, 返回结果为布尔值
while(m.find()){
System.out.println(m.group()); // 获取匹配到的结果
}
// 综合练习: ip 地址排序
// "192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55"
public static void test(){
String ip_str = "192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55";
// 为了让 ip 可以按照字符串顺序比较, 只要让 ip 的每一段位数相同,
// 所以, 补零. 按照每一位所需做多 0 进行补充. 每一段都加两个 0
ip_str = ip_str.replaceAll("(\d+)", "00$1");
// 然后每一段保留数字 3 位
ip_str = ip_str.replaceAll("0*(\d{3})","$1");
// 将 ip 地址切出, 切出结果为 String 类型数组
String[] ips = ip_str.split(" +"); // 以一次(或多次)空格切出
// 将每个 ip 地址取出, 放入 TreeSet 集合中比较
TreeSet<String> ts = new TreeSet<String>();
for(String ip : ips){
ts.add(ip);
}
for(String ip : ts){
System.out.println(ip.replaceAll("0*(\d+)","$1"));
}
}
- 捕获组
**参考资料** - [JavaSE 基础视频(毕向东)](https://www.bilibili.com/video/av3133827/#page=8) - [JDK 1.6 中文文档](http://tool.oschina.net/apidocs/apidoc?api=jdk-zh) - [Java替换指定字符串前后的指定字符(类似于String的trim()方法](https://blog.csdn.net/ylchou/article/details/79548074) - [What is a good alternative of LTRIM and RTRIM in Java?](https://stackoverflow.com/questions/15567010/what-is-a-good-alternative-of-ltrim-and-rtrim-in-java)