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

来源:互联网 发布:html5动画源码 编辑:程序博客网 时间:2024/06/07 05:00

——- android培训、java培训、期待与您交流! ———

正则表达式:符合一定规则的表达式
正则表达式是Java处理字符串、文本的重要工具
特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。
好处:可以简化对字符串的复杂操作
弊符号定义越多,正则越长,阅读性越差

java.util.regex.Matcher 模式类:用来表示一个编译过的正则表达式。
java.util.regex.Pattern 匹配类:用模式匹配一个字符串所表达的抽象结果。

1、Java对反斜线处理的问题

在其他语言中,\表示要插入一个字符\;
在Java语言中,\表示要插入正则表达式的反斜线,并且后面的字符有特殊意义。

在Java正则表达式中,如果要插入一个\字符,则需要在正则表达式中写成\\
如果在正则表示式中表示回车换行等,则不需要多添加反斜线了。比如回车\r就写作\r.

组概念,组是用括号划分的正则表达式,可以通过编号来引用组。组号从0开始,有几对小括号就表示有几个组,并且组可以嵌套,组号为0的表示整个表达式,组号为1的表示第一个组,依此类推。
例如:A(B)C(D)E正则式中有三组,组0是ABCDE,组1是B,组2是D;
A((B)C)(D)E正则式中有四组:组0是ABCDE,组1是BC,组2是B;组3是C,组4是D。

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

常见的操作思路:
1.如果只想知道字符串是对是错,使用匹配
2.想要将已有的字符串变成另一个字符串。替换
3.想要按照自定的方式将字符串变成多个字符串。切割,获取规则一维的字串。
4.想要拿到符合需求的子串,获取,获取符合规则的字串

常见具体操作:
1:匹配:String matches方法。用规则匹配整个字符串,只要一处不符合规则,就匹配结束,返回false

2.切割: String split();

3.替换:String replaceAll();

4.获取:

匹配示例:
检索邮箱名称。手机号码。QQ号码等等输入是否符合规则

{    public static void main(String[] args)     {        //checkQQ1();        //Demo();        //splitDemo();        //splitDemo("c:\\abc\\a.txt","\\\\");        //splitDemo("erkkbsycqqdfkkscmf","(.)\\1");//按照叠词完成切割。为了让规则的结果可以被重用                                                //可以将规则封装成一个组,用()完成。组的出现都有编号                                                //从1开始。想要使用已有的组可以通过\n(n就是编号)的形式来获取。        //(.)重用的部分用小括号括起来,就是封装成一个组。        //(.)\1//第一位的内容在第二位又出现了        String str="wer027354850274850tymen950";//将字符串中的数字替换成#        replaceAllDemo(str,"\\d{5,}","#");//5个以上的数字替换成一个#号        String str2="rekkygggmksbfuyyzzn";//将叠词替换成一个字符*        replaceAllDemo(str2,"(.)\\1+","*");        replaceAllDemo(str2,"(.)\\1+","$1");//将重叠的字符替换成单个字母    }    public static void replaceAllDemo(String str,String reg,String newStr)    {        str=str.replaceAll(reg,newStr);        System.out.println(str);    }    public static void splitDemo(String str,String reg)    {        //String str="zhangsan  lisi   wangwu";        //String reg=" +";//多个空格        //String reg="\\."//正则表达式里面的.,按照。来切割        String[] arr=str.split(reg);        for(String s:arr)        {            System.out.println(s);        }    }    /*    匹配    手机号段:    13xxx,15xxx,18xxx    */    public static void Demo()    {        String tel="18939850857";        String telReg="1[358]\\d{9}";        System.out.println(tel.matches(telReg));    }       public static void checkQQ1()    {        String qq="18939850857";        String regex="[1-9][0-9]{4,14}";        //String regex="[1-9]\\d{4,14}";//第一位是数字。后面共4-14位是数字。        boolean flag=qq.matches(regex);        if(flag)            System.out.println(qq+"...is Ok");        else            System.out.println(qq+"....不合法");    }    /*    对qq号码进行效验    要求:5--15 0不能开头,只能是数字    以下方式,使用string类中的方法,进行组合完成了需求,但是带么过于复杂。    */    public static void checkQQ()    {        String qq ="3826";        int len=qq.length();        if(len>=5&&len<=15)        {            if(!qq.startsWith("0"))            {                try                {                    long l=Long.parseLong(qq);                    System.out.println("qq:"+1);                }                catch (NumberFormatException e)                {                    System.out.println("出现非法字符。。。。。");                }                /*                char[] arr=qq.toCharArray();                boolean flag=true;                for(int x=0;x<arr.length;x++)                {                    if(!(arr[x]>='0'&&arr[x]<='9'))                    {                        flag=false;                        break;                    }                }                if(flag)                {                    System.out.println("qq:"+qq);                }                else                {                    System.out.println("出现非法字符");                }                */            }            else            {                System.out.println("开头不能为0");            }        }        else        {            System.out.println("长度不合法");        }    }}这里写代码片

替换示例:
去掉重复字符,

import java.util.regex.*;class  RegexTest{    public static void main(String[] args)     {        getDemo();      }    public static void getDemo()    {        String str="我我...我我...我要.....要要....要去....去去去..吃吃吃..吃..吃饭.饭...饭饭饭..饭.....饭";        /*        将已有字符串先变成另一个字符串,使用替换功能。        1.可以先将.去掉。        2,在将多个重复的内容变成单个内容。        */        str=str.replaceAll("\\.+","");        System.out.println(str);        str=str.replaceAll("(.)\\1+","$1");//去叠词        System.out.println(str);        }}

编译结果:


192.68.1.254.102.49.23.013.10.10.10.10.002.2.2.2.8.109.90.30
将IP地址进行地址段顺序的排序
思路:
1.按照字符串自然顺序,按照需要最多的0来补齐,每一段保证都有3位
2.将每一段只保留3位。保证ip地址每一段都是3位
3..通过切割功能,将ip地址进行拆分存储在TreeSet集合中(存储时就进行默认排序)
4.高级for循环打印集合中的ip地址,并去掉ip地址前面多余的0;

代码示例:

import java.util.regex.*;import java.util.*;class  RegexTest2{    public static void main(String[] args)     {        ipSort();        //getDemo();        }public static void ipSort()        {                String ip="192.68.1.254 102.49.23.013 10.10.10.10 002.2.2.2 8.109.90.30";                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>();                for(String s :arr)                {                    ts.add(s);                }                for(String s:ts)                {                    System.out.println(s.replaceAll("0*(\\d+)","$1"));                }        }   }

编译结果:


正则表达式的第四个功能
4.获取

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

import java.util.regex.*;class RegexDemo2 {    public static void main(String[] args)     {        getDemo();    }    public static void getDemo()    {        String str="ming tian jiu yao fang jia le ,dajia";        String ren="\\b[a-z]{3}\\b";// (\b)单词边界 找出三个的单词        //str="123456";        //String reg="[1-9]\\d{4,14}";        //将规则封装成对象。        Pattern p=Pattern.compile(ren);        //让正则对象和要作用的字符串想关联。获取匹配器对象。        Matcher m=p.matcher(str);        //System.out.println(m.matches());        //String类中的matches方法用的是 Parter 和Matcher对象来完成的        //被String方法封装,使用简单,但功能单一        /*        boolean b=m.find();//将规则作用到字符串上,并进行复核规则的子串查找        System.out.println(b);// true        System.out.println(m.group());//用于获取匹配后的结果。min        boolean b1=m.find();        System.out.println(b1);// true        System.out.println(m.group());// tia        */        while(m.find())//找出3个字母的单词        {            System.out.println(m.group());        }    }}

常用邮箱名称效验方式
代码:

class  RegexTest3{    public static void main(String[] args)     {        checkMail();    }    public static void checkMail()    {        String mail="abc120@sina.com.cn.cn";        mail="1@1.1";        String reg="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";//较为精确的匹配        reg="\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配。(网站有这样的匹配)        //mail.indexoF("@")!=-1;//有 @ 就能匹配上        System.out.println(mail.matches(reg));    }}
0 0