首页 > 其他 > 详细

黑马程序员---正则表达式

时间:2014-01-16 23:34:18      阅读:540      评论:0      收藏:0      [点我收藏+]

正则表达式,是用于操作字符串的规则。

如果需要验证一个QQ号码,要求为长度在5~15位之间,不能包含非数字,不能以零开头。

使用常规方法:

bubuko.com,布布扣
public static void checkQQ()
    {
        String qq="2484490912546779808679757806";

        int len=qq.length();

        if(len>=5&&len<=15)
        {
            if(!qq.startsWith("0"))
            {
                char[] ch=qq.toCharArray();
                boolean flag=true;
                for(int x=0;x<ch.length;x++)
                {
                    if(!(ch[x]>=‘0‘&&ch[x]<=‘9‘))
                        flag=false;
                }
                if(flag)
                {
                    System.out.println("QQ="+qq);
                }else System.out.println("QQ号码中不可以包含非数字");

            }else System.out.println("QQ号码不可以以零开头");

        }else System.out.println("长度太长");
    }
bubuko.com,布布扣

如果使用正则表达式来进行验证:

bubuko.com,布布扣
public static void checkQQ_1()
    {
        String qq="0123456907945806";

        String regex="[1-9][0-9]{4,14}";
        boolean flag=qq.matches(regex);

        if(flag)
            System.out.println(qq+"符合条件,匹配成功");
        else 
            System.out.println(qq+"匹配失败");
    }
bubuko.com,布布扣

由两段程序发现,使用正则表达式,可以是代码变得更加简单。

正则表达式的功能:

<1>匹配,使用String类中的matches方法

首先我们要了解一些常用的正则表达式的写法:

字符类:

[abc] abc(简单类)
[^abc] 任何字符,除了 abc(否定)
[a-zA-Z] azAZ,两头的字母包括在内(范围)
[a-d[m-p]] admp[a-dm-p](并集)
[a-z&&[def]] def(交集)
[a-z&&[^bc]] az,除了 bc[ad-z](减去)
[a-z&&[^m-p]] az,而非 mp[a-lq-z](减去)


预定义字符类:

. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]

 

Greedy数量词:

X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n
X{n,} X,至少 n
X{n,m} X,至少 n 次,但是不超过 m

练习:匹配手机号。13xxx,15xxx,18xxx

bubuko.com,布布扣
class  RegexDemo2
{
    public static void main(String[] args) 
    {
        checkTel();
    }


    public static void checkTel()
    {
        String tel="15275560g79";
        String regex="1[358]\\d{9}";
        boolean flag=tel.matches(regex);

        if(flag)
            System.out.println(tel+"手机号码匹配成功");
        else
            System.out.println(tel+"匹配失败");
    }
}
bubuko.com,布布扣

<2>切割 使用String类中的split方法:

 

bubuko.com,布布扣
class RegexDemo3 
{
    public static void main(String[] args) 
    {
        //按照.进行切割,但是.在正则表达式中表示任意字符,所以要进行转义\\.
        splitDemo("zhangsan.wangwu.lisi","\\.");
        splitDemo("c:\\abc\\a.txt","\\\\");
        //按照叠词进行切割,可以将规则封装成一个组,用()来完成,组都是有编号的,从1开始进行编号
        //如果想要使用已经捕获的组,可以通过\n(n为组的编号)的形式来获取
        //((A)(B(C))),有四个组,看左括号数目来确定组数
        splitDemo("erkktyuqqaxcft","(.)\\1+");

    }

    public static void splitDemo(String str,String regex)
    {
        String[] arr=str.split(regex);

        for(String s:arr)
        {
            System.out.println(s);
        }
    }
}
bubuko.com,布布扣

<3>替换 使用String类中的repalceAll方法:

 

bubuko.com,布布扣
class RegexDemo4 
{
    public static void main(String[] args) 
    {
        //将字符串中的五个以上的数字替换成#号
        replaceAllDemo("wer4657558844ty976767uiod45667","\\d{5,}","#");

        //将字符串中的叠词替换成#号
        replaceAllDemo("erkktyuqqaxcft","(.)\\1+","#");

        //将重叠的字母替换成单个字母,zzzz--z,$1用来获取前面正则表达式中获取到的组
        replaceAllDemo("erkktyuqqaxcft","(.)\\1+","$1");

        
        //将字符串中的叠词替换成$号,$在正则表达式中为特殊符号,直接使用会出现异常,应该进行转义\\$
        replaceAllDemo("erkktyuqqaxcft","(.)\\1+","\\$");


    }


    public static void replaceAllDemo(String str,String regex,String newstr)
    {
        str=str.replaceAll(regex,newstr);
        System.out.println(str);
    }
}
bubuko.com,布布扣

<4>获取 

 

bubuko.com,布布扣
/*
正则表达式的获取功能。
操作步骤:
1.将正则表达式封装成对象
2.让正则对象和要操作的字符串相关联的
3.关联后。获取正则匹配引擎
4.通过引擎对符合规则的子串进行操作,比如取出

*/

import java.util.regex.*;
class RegexDemo5 
{
    public static void main(String[] args) 
    {
        getDemo();
    }


    public static void getDemo()
    {
        String str="ming tian jiu yao fang jia le,da jia";
        //str="0123456";

        //String reg="[1-9]\\d{4,14}";
        //String reg="[a-z]{3}";//没有单词边界,没区分单词和单词

        //加入\b单词边界
        String reg="\\b[a-z]{3}\\b";
        //将规则封装成对象
        Pattern p=Pattern.compile(reg);

        //让正则对象和要作用的字符串相关联
        Matcher m=p.matcher(str);//返回值为此模式的新匹配器,即引擎
        
        //其实String类中的matches方法就是使用Pattern和Matcher实现的
        //System.out.println(m.matches());

        while(m.find())//将规则作用在字符串上,并进行符合规则的子串查找
        {
            System.out.println(m.group());//用于获取匹配后的结果

            System.out.println(m.start()+"......."+m.end());//打印出来每个部分的角标,包含头不包含尾
        }
    }
}


/*
 
       //分析以下结果:
       String str="ming tian jiu yao fang jia le,da jia";
       String regex="\\b[a-z]{4}\\b";
       Pattern p=Pattern.compile(regex);
       Matcher m=p.matcher(str);
       System.out.println(m.matches());//返回false,mathes会将整个字符串与模式匹配
                                       //对于:\\b[a-z]{4}\\b 该规则限定长度为4的字符串,因此不匹配
       
       while(m.find())//如果使用\\b[a-z]{4}\\b规则匹配
       System.out.println(m.group());//理应结果是ming tian fang
                                      //但是只有tian,fang这是因为在调用m.mathes后,匹配失败,内部指针已指到t位置,
                                      //从该位置在开始匹配

*/
bubuko.com,布布扣

练习1:需求为将下面的字符串转为:我要学编程

bubuko.com,布布扣
/*
练习:将下面的字符串转为:我要学编程
*/
    public static void test_1()
    {
        String str="我我...我我...我要..要要..要要...学学学....学学...编编编...编程.程.程程...程...程";

        //先将字符串中的...替换成空字符串
        str=str.replaceAll("\\.+","");

        //然后将多个重复的字符换成单一字符
        str=str.replaceAll("(.)\\1+","$1");
        System.out.println(str);
        
        
    }
bubuko.com,布布扣

练习2:将192.168.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30将IP地址进行地址段的排序。

 

bubuko.com,布布扣
/*
将192.168.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30
将IP地址进行地址段顺序的排序
*/

    public static void test_2()
    {
        //先将IP地址的每一段都补两个零
        String ip="192.168.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";

        ip=ip.replaceAll("(\\d+)","00$1");
        //取每一段的后三位
        ip=ip.replaceAll("0*(\\d{3})","$1");

        String[] arr=ip.split(" +");

        TreeSet<String> ts=new TreeSet<String>();
        for(String s:arr)
        {
            ts.add(s);
        }

        for(String s:ts)
        {
            System.out.println(s.replaceAll("0*(\\d+)","$1"));
        }
    }
bubuko.com,布布扣

练习3:对邮件地址进行校验

bubuko.com,布布扣
    public static void checkMail()
    {
        String mail="abc12@sina.com";

        String reg="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";
        System.out.println(mail.matches(reg));
    }
bubuko.com,布布扣

网页爬虫:

bubuko.com,布布扣
import java.io.*;
import java.util.regex.*;
import java.net.*;


class RegexTest2 
{
    public static void main(String[] args) throws Exception
    {
        getMails_1();
    }

    /*
    获取指定文档中的邮件地址
    使用获取功能Pattern Matcher
    */

    public static void getMails()throws Exception
    {
        BufferedReader bufr=new BufferedReader(new FileReader("mail.txt"));

        String line=null;
        String mailreg="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";

        Pattern p=Pattern.compile(mailreg);

        while((line=bufr.readLine())!=null)
        {
            Matcher m=p.matcher(line);
            while(m.find())
            {
                System.out.println(m.group());
            }
        }
    
    }


    public static void getMails_1()throws Exception
    {
        URL url=new URL("http://192.168.123.7:8080/myweb/mail.html");

        URLConnection conn=url.openConnection();

        BufferedReader bufIn=new BufferedReader(conn.getInputStream());

        String line=null;
        String mailreg="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";

        Pattern p=Pattern.compile(mailreg);

        while((line=bufIn.readLine())!=null)
        {
            Matcher m=p.matcher(line);
            while(m.find())
            {
                System.out.println(m.group());
            }
        }
    }
}
bubuko.com,布布扣

 

 

 

 

 

 

黑马程序员---正则表达式

原文:http://www.cnblogs.com/mandy920213/p/3522074.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!