从qq号验证说Java正则表达式的必要性

为什么要使用正则表达式:

使用基本的字符串操作,判断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"));
        }
    }
}

你可能感兴趣的:(java,正则表达式,String)