博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java:正则表达式的详解
阅读量:6161 次
发布时间:2019-06-21

本文共 9132 字,大约阅读时间需要 30 分钟。

正则表达式:符合一定规则的表达式。
作用:用于专门操作字符串。
特点:用一些特定的符号来表示一些代码的操作.这样就简化书写。所以学习正则表达式就是学习一些特殊符号的使用。
好处:可以简化对字符串的操作。
弊端:符号定义越多,正则越长,阅读性越差。
 
具体操作功能:
  1.匹配    boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式。
                用规则匹配整字符串,只要有一处不符合规则,就匹配结束,返回false  
 
  2.切割    String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。
 
 
  3.替换    String replaceAll(String regex, String replacement)
使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 
           
String replaceFirst(String regex, String replacement)
使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
对上面的三种进行演示如下:
class RegexDemo{    public static void main(String[] args)    {        //CheckQQ_1();        //CheckQQ();        //demo();        //CheckTel();        //SplitDemo();        ReplaceDemo();    }   //替换演示   public static void ReplaceDemo()   {        //String str = "123dffhe568kkkdsr7885445e";//要求:将字符串的数字替换成‘#’        //String regex = "\\d{5,}";//可以规定超过5个数字就将数字替换成‘#’        //String s = "#";                //String str = "zhakksxsqqwanwwwwu";//将叠词进行替换'&'        //String regex = "(.)\\1+";        //String s = "&";            String str = "zhakksxsqqwanwwwwu";//将叠词字符由多个变成一个        String regex = "(.)\\1+";        String s = "$1";                            System.out.println(str.replaceAll(regex,s));   }           //切割演示    public static void SplitDemo()    {        //String  str = "zhangsan    lisi wangwu";        //String regex = " +";     //一次或多次空格                //String  str = "zhangsan.lisi.wangwu";        //String regex = "\\.";    //特殊字符,对点和反斜杠进行转义                //String  str = "zhangsan,lisi,wangwu";        //String regex = ",";           //String  str = "c:\\zhangsan\\lisi\\wangwu";        //String regex = "\\\\";        String  str = "zhakksxsqqwanwwu";//按照叠词进行切割        String regex = "(.)\\1+";//第一次切割的结果为组被重用,接着进行后面一次或多次的切割(每一个组按照顺序有编号,反向引用第一组)                        String[] arr = str.split(regex);                for(String s: arr)        {            System.out.println(s);        }    }    //匹配字符演示    public static void demo()    {        String str = "a";        String regex = "[bcd]";//给定要比较的字符串中内容必须只能是规则中的某一个字符。        boolean b = str.matches(regex);        System.out.println(b);//false    }        //匹配手机号 13xxx,15xxx,18xxx    public static void CheckTel()    {        String tel = "15000000000";        String regex = "[1][358]\\d{9}";//"[1][358]\\d{3,10}"        System.out.println(tel.matches(regex));    }        //匹配QQ号    public static void CheckQQ()    {        String qq = "01237458";        //String regex = "[1-9][0-9]{4,14}";        String regex = "[1-9]\\d{4,14}";                boolean flag = qq.matches(regex);                if(flag)            System.out.println("qq:"+qq);        else            System.out.println("qq不符合要求!");    }                /*    需求:对QQ号码进行校验    要求:5~15位,0不能开头,只能是数字    这种方式是使用String类中的方法,进行组合完成了需求,但是代码过于复杂。    */    public static void CheckQQ_1()    {        String qq = "1237458";        int len = qq.length();        if(len>=5 && len<=15)        {            if(!qq.startsWith("0"))//qq.chatAt(0)==0  //Integer.parseInt("12a")  NumberFormatException            {                try                {                  long l = Long.parseLong(qq);                  System.out.println("qq:"+qq);                }                catch(NumberFormatException e)                {                  System.out.println("qq出现非法字符......");                    }                                /*                char[] arr = qq.toCharArray();                boolean flag = true;                for(int i=0;i
='0' && arr[i]<='9')) { flag = false; break; } } if(flag) { System.out.println("qq:"+qq); } else { System.out.println("qq出现非法字符!"); } */ } else { System.out.println("qq不能以0开头!"); } } else { System.out.println("qq号长度错误,请重新输入!"); } } }
java.util.regex 
类 Pattern(final):正则表达式的编译表示形式。 
static Pattern compile(String regex) 
 将给定的正则表达式编译到模式中。 
 
java.util.regex 
类 Matcher(final):通过解释 Pattern 对 character sequence 执行匹配操作的引擎。  
int end() 
 返回最后匹配字符之后的偏移量(最后但不包括的索引)。
int start() 
 返回以前匹配的初始索引。
             String group() 
              返回由以前匹配操作所匹配的输入子序列。  
 
正则表达式的第四个功能:
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,du jia!";        System.out.println(str);                String regex = "\\b[a-z]{4}\\b";//查找四个单词的子字符串                //str = "1237458";        //String regex = "[1-9]\\d{4,14}";                        //将规则封装成对象。static Pattern compile(String regex)         Pattern p = Pattern.compile(regex);       //让正则对象与要操作的字符串关联,返回一个匹配器。Matcher matcher(CharSequence input)。String实现了字符序列接口CharSequence            Matcher m = p.matcher(str);       //通过引擎(匹配器)对负荷规则的字符串进行操作,例如引擎对象的方法 matches()                //System.out.println(m.matches());//其实String类中的matcher方法。用的就是Pattern和Matcher对象来完成的。                                        //只不过被String的方法封装后,使用起来更为简单。但是功能却很单一。                while(m.find())//将规则作用到字符串上,并进行符合规则的子串查找。        {           System.out.println(m.group());//用于获取匹配后的结果               System.out.println(m.start()+"...."+m.end());        }    }}
 
正则表达式的应用举例如下:
练习1:将下列字符串转换成:我要学编程
到底用四种功能中的哪一个?或者哪几个呢?
思路方式:
   1.如果只是想知道该字符串是否对与错,使用匹配
   2.想要将已有的字符串替换成其他的字符串,使用替换
   3.想要按照自定的方式将字符串变成多个子串,使用切割。获取规则以外的子串
   4.想要拿到符合需求的字符串子串,使用获取。获取符合规则的子串
class RegexTest{    public static void main(String[] args)    {        Test();    }        public static void Test()    {        String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编编..程.程程...程...程";        StringBuilder sb = new StringBuilder();                //先切割(以出现一次或多次的点作为分隔符。特殊字符,对点和反斜杠进行转义)        String regex1 = "\\.+";                String[] arr = str.split(regex1);                for(String s:arr)        {           sb.append(s);        }                //再替换(将一个或多个叠词替换成一个字符)        String regex2 = "(.)\\1+";        String s1 = "$1";        System.out.println(sb.toString().replaceAll(regex2,s1));    }}
练习2:192.68.1.54 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30
将ip地址进行地址段的顺序进行排序
 
思路:还按照字符串的自然顺序,只要让它们每一段都是3位即可。
1.按照每一段需要的最多的0进行补齐,那么每一段至少能保证有3位
2.将每一段只保留3位。那么,所有的ip地址都保留了3位。
3.切割后,再进行排序
4.进行最后的一次替换,返回原ip
public static void ipsort()    {        String ip = "192.68.1.54 102.49.23.013 10.10.10.10 2.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
ts = new TreeSet
(); for(String s: arr) { ts.add(s); } for(String s: ts) { System.out.println(s.replaceAll("0*(\\d+)","$1")); } } //对qq邮件地址进行校验 public static void checkMail() { String mail = "xiayuanquan@qq.com"; //mail = "1360074459@qq.com"; //String regex = "[a-zA-Z0-9_]+@(qq|QQ)(\\.[a-zA-Z]+)+"; String regex = "\\w+@\\w+(\\.\\w+)+"; if(mail.matches(regex)) System.out.println(mail); else System.out.println("mail is error!"); } }
练习3:网页爬虫(蜘蛛)
import java.io.*;import java.util.regex.*;import java.net.*;class RegexTest3{    public static void main(String[] args)throws Exception    {        getMails();        getMails_1();    }        //获取指定文档中的邮件地址,使用获取功能使用Pattern,Matcher    public static void getMails()throws Exception    {      BufferedReader bufr = new BufferedReader(new FileReader("mails.txt"));                String line = null;      String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";      //String regex = "\\w+@\\w+(\\.\\w+)+";            Pattern p = Pattern.compile(regex);             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://www.baidu.com:8080/mail.html");              URLConnection conn = url.openConnection();              BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream()));             String line = null;      String regex = "\\w+@\\w+(\\.\\w+)+";            Pattern p = Pattern.compile(regex);             while((line=bufIn.readLine())!=null)      {        Matcher m = p.matcher(line);                while(m.find())        {           System.out.println(m.group());                        }      }           }    }

 

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!
本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4914330.html
,如需转载请自行联系原作者
你可能感兴趣的文章
logstash向elasticsearch写入数据,如何指定多个数据template
查看>>
Node.js:Web模块、文件系统
查看>>
【转】灵活运用 SQL SERVER FOR XML PATH
查看>>
WCF角色服务
查看>>
常用sql001_partition by 以及 row_number()和 dense_rank()和rank()区别
查看>>
C语言:单链表的实现(包括:尾插、尾删、头插、头删、指定位置插入、长度、打印)...
查看>>
【数据结构】广义表的默认成员函数、深度、大小、打印
查看>>
老李推荐:第8章2节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-解析处理命令行参数...
查看>>
Java 静态代理、Java动态代理、CGLIB动态代理
查看>>
使用jQuery开发一个基于HTML5的漂亮图片拖拽上传web应用
查看>>
Java 多线程 之 Runnable
查看>>
实验三 :欺骗
查看>>
【99JS手记】之一:nth-child选择器
查看>>
oracle日期处理函数
查看>>
python3.6 - threading 多线程编程基础(1)
查看>>
Linux学习总结(四)-两种模式修复系统,单用户,救援模式
查看>>
DB2 V10.5 PureScale支持HADR
查看>>
msscript 64位找不到的替代方法
查看>>
css base64 图片背景
查看>>
中文编程汉语编程开发的大型管理软件案例
查看>>