java--正则表达式

本篇主要介绍了一些常用的正则表达式
例子:判断手机号是否符合规则

public static void main(String[] args) {
        String s = "13733121934";

        if(s.matches("[1][358][0-9]{9}"))
            System.out.println("zhengque");

        String s1 = "in my heart, you are a pig";
        String[] ss = s1.split(" ");
        for(String c:ss)
            System.out.println(c);

        String s2 = "www.sohu.com";
        String[] sss = s2.split("\\.");
        for(String c:sss)
            System.out.println(c);

        String s3 = "sdfs sdfjs.sdf 222.30.230.7.sdfs wef";
        String s4 = s3.replaceAll("[0-9]" ,"数字");
        System.out.println(s4);

    }

对字符串的操作1:
 匹配——其实使用的就是String类中的matches方法。
 切割——其实使用的就是String类中的split方法。
 替换——其实使用的就是String类中的replaceAll()方法。
讲解正则表达式的地方略过
[http://blog.csdn.net/o0guang0o/article/details/45166689]
例子

public class Test {
    // 匹配
    public static void functionDemo_1() {
        // 匹配手机号码是否正确。
        String tel = "15800001111";
        String regex = "1[358]\\d{9}";
        boolean b = tel.matches(regex);
        System.out.println(tel + ":" + b);
    }
    // 切割
    public static void functionDemo_2() {
String str1 = "Java string split test";
        String[] strarray = str1.split(" ");
        for (int i = 0; i < strarray.length; i++)
            System.out.println(strarray[i]);

        String[] strarray1 = str1.split(" ", 2);// 使用limit,最多分割成2个字符串
        for (int i = 0; i < strarray1.length; i++)
            System.out.println(strarray1[i]);

        String str2 = "192.168.0.1";
        String[] strarray2 = str2.split("\\.");
        // String[] strarray2=str2.split(".");这句不行,为什么?
        for (int i = 0; i < strarray2.length; i++)
            System.out.println(strarray2[i]);
        String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";
        String[] names = str.split("(.)\\1+");
        for (String name : names)
            System.out.println(name);
    }
    // 替换
    public static void functionDemo_3() {
 String str1 = "asfas5fsaf5s4fs6af.sdaf.asf.wqre.qwr.fdsf.asf.asf.asf";
//将字符串中的.替换成_,因为.是特殊字符,所以要用\.表达,又因为\是特殊字符,所以要用\\.来表达.
         str1 = str1.replaceAll("\\.", "_");
         System.out.println(str1);  
        String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";
        str = str.replaceAll("(.)\\1+", "$1");
        System.out.println(str);
        String tel = "15800001111";// 158****1111;
        tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
        System.out.println(tel);
    }
    public static void functionDemo_4() {
        String str = "da jia hao,ming tian bu fang jia!";
        String regex = "\\b[a-z]{3}\\b";
        // 1,将正则封装成对象。
        Pattern p = Pattern.compile(regex);
        // 2, 通过正则对象获取匹配器对象。
        Matcher m = p.matcher(str);
        // 使用Matcher对象的方法对字符串进行操作。
        // 既然要获取三个字母组成的单词
        // 查找。 find();
        System.out.println(str);
        while (m.find()) {
            System.out.println(m.group());// 获取匹配的子序列
            System.out.println(m.start() + ":" + m.end());
        }
    }
    public static void main(String[] args) {
        functionDemo_2();
    }
}

附:
1、常用正则表达式
匹配Email地址的正则表达式:
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:
[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):
^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:
\d{3}-\d{8} ?\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:
[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:
[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字
匹配身份证:
\d{15} ?\d{18}
评注:中国的身份证为15位或18位
匹配ip地址:
\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用
^[A-Za-z]+$//匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$ //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
2、切割叠词
当你想要对一个规则的结果进行重用的时候,那么你可以把它封装成组,这个组中的结果就可以再新使用。组封装好之后,有一个自动的编号,从1开始。
而在引用各个组的结果时候,就使用\组号(也就是括号出现的位置)。
“jijoosfdsffklklklllewfwf”.split(“(.)\1”)。
切割与匹配的最大区别在于:匹配只要不满足,就返回false
而切割当不满足时候,继续向下进行匹配后切割。
比如说上例:
找到j 然后去看第二位是否是j,不是,则继续找第二位的i,看第三位是否是i,依次类推。直到oo 然后将字符串切割为jij sfdsffklklklllewfwf,然后继续寻找第二的字串中是否满足正则表达式中的定义。然后依次类推。
当想要使用oooooo这种形式去切割的时候,使用 “(.)\1+” 也就表示后边一个或多个字符和第一个字符相等的时候切割。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值