为什么要使用正则表达式:
使用基本的字符串操作,判断qq号是否合法:
public class QQCheck {
public static void main(String[] args) {
String qq = "12121212";
if(qq.length()>=5 && qq.length()<=15){
if(!qq.startsWith("0")){
try {
Long l = Long.parseLong(qq);
System.out.println("qq:"+l);
} catch (NumberFormatException e) {
System.out.println("只能是数字");
}
}
else {
System.out.println("不能以0开头");
}
}
else {
System.out.println("长度错误");
}
}
}
很麻烦,而且以“-”开头的也当做是qq号,错误很难发现!
使用正则表达式
public class QQRegex {
public static void main(String[] args) {
String qq = "12342232";
String regex = "[0-9][1-9]{4,14}";
boolean flag = qq.matches(regex);
if(flag)
System.out.println("Correct");
else {
System.out.println("Wrong");
}
}
}
非常简单!
正则表达式用法:
就是学习特殊符号的使用(参考API文档)
1. 匹配 String matches 方法
- 反斜杠要出现就一对出现
- ”\d”代表[0-9]
手机号码:
String telRegex = "1[358]\\d{9}";
2. 切割 String split 方法
public class SplitDemo {
public static void main(String[] args) {
splitDemo();
}
public static void splitDemo(){
String str = "zhangsan lisi wangwu";
String sRegex = " +";
String[] arr = str.split(sRegex);
for(String s:arr){
System.out.println(s);
}
}
}
如何切”zhangsan.lisi.wangwu”?
reg = “\.”;
如何切”erdfhhdjoasijjdaodsaadw”?使用其中的叠词
reg = “(.)\1”;
()括起来的是一组规则,\1是重用第一组规则
判断有几组规则?看有几个左括号
3. 替换 String replaceAll()
“dewddddew2324323ddew2324e32dds”
1. 将其中4个以上的数组替换成“#”:
String str = replaceAll(“\d{5,}”,”#”);
2. 将其中的重叠字母替换成单个字母:
String str = replaceAll(“(.)\1”,”$1”); 美元符号代表使用正则表达式中的第几个规则
4. 获取,重点
导包:import java.util.regex.*;
1. 将正则表达式封装成对象;
2. 将正则对象和要操作的字符串想关联;
3. 关联后,获取正则匹配引擎,也就是匹配器对象(有点类似于迭代器)
4. 通过匹配器对复合规则的子串进行操作,比如查找,取出,全部取出
public class MatcherClass {
public static void main(String[] args) {
matchClass();
}
public static void matchClass(){
String str = "wou you yi tou xiao mao lv, cong lai ye bu qi!";
String reg = "\\b[a-z]{3}\\b";
//1. 将正则表达式的规则封装成Pattern对象
Pattern p = Pattern.compile(reg);
//2. 将正则表达式和要作用的字符串关联,获得匹配器对象m
Matcher m = p.matcher(str);
//3.使用匹配器对象m,进行各种操作(这时,匹配器中包含有正则表达式和作用字符串的信息)
//注意使用匹配器过程中,匹配器指针不断移动!
System.out.println(m.matches());//判断第一个不符合后不符合,指针已经移动到y
while(m.find()){
System.out.println(m.group());
System.out.println(m.start()+"..."+m.end());
}
}
}
练习:对ip地址进行排序
public class IpSort {
public static void main(String[] args) {
ipTest();
}
public static void ipTest(){
String ip = "192.146.4.3 12.243.54.5 1.23.4.5 10.20.40.101";
ip = ip.replaceAll("(\\d+)","00$1");
System.out.println(ip);
ip = ip.replaceAll("0*(\\d{3})", "$1");
System.out.println(ip);
String[] arr = ip.split(" ");
TreeSet<String> ts = new TreeSet<String>();//使用TreeSet自动排序的特性,如果有重复元素,使用Arrays.sort()方法
for(String s:arr){
ts.add(s);
}
for(String s:ts){
System.out.println(s.replaceAll("0*(\\d+)","$1"));
}
}
}