您的位置:首页 > 编程语言 > Java开发

java笔记31 正则表达式

2015-06-21 11:29 423 查看
1.       正则表达式

       正则表达式:获取符合一定规则的字符串的方式

        作用:专门用于操作字符串

        特点:用一些特定的符号表示一些代码操作,简化书写

                           学习特殊符号的使用

        好处:可以简化对字符串的复杂操作

        弊端:阅读性较差

2.        具体操作功能

1、匹配

                 String matches方法

                 [abc] a、b 或 c(简单类)

                                    某一位只能是a或者b或者c

                   [^abc] 任何字符,除了 a、b 或 c(否定)

                                     某一位除去a、b、c

                   [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)

                   [a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)

                                     并集

                   [a-z&&[def]] d、e 或 f(交集)

                   [a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)

                   [a-z&&[^m-p]] a 到 z,而非 m 到 p:[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]

         示例        

 public static void checkNum(String qq)    {        String regex="[1-9]\\d*";//数字1-9,至少有一位        boolean flag=qq.matches(regex);        if(flag)            System.out.println(qq+"...ok");        else            System.out.println(qq+"....非法");    }    public static void checkTel(String tel)    {        /*            匹配手机号段         */        String regex="1[358]\\d{9}";//1开头,第二位是358,后面还有9位数字        boolean flag=tel.matches(regex);        if(flag)            System.out.println(tel+"...ok");        else            System.out.println(tel+"....非法");    }}

 

2、切割

                   不能直接用“.”  点号表示任意字符

                 要加两个反斜杠  \\

                          splitDemo("C:\\abc\\a.txt","\\\\");// \\表示一个反斜杠

                 (.)\\1

捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:

                   1     ((A)(B(C)))

                   2     \A

                   3     (B(C))

                   4     (C)

组零始终代表整个表达式。

public class H_01RegexDemo {    public static void main(String[] args) {             splitDemo("C:\\abc\\a.txt","\\\\");// \\表示一个反斜杠        splitDemo("derkkserqquisedooo","(.)\\1+");//  \\1表示重复第一个组即按照连续字符切割 至少两个    }    public static void splitDemo(String str,String reg)    {        //按照多个空格切割        String []arr=str.split(reg);        for(String s:arr)        {            System.out.println(s);        }    }
}

         结果:

                   C:

abc

a.txt

der

ser

        

         3、 替换示例

public class H_04RegexReplace {    public static void main(String[] args) {           String str="wer34343536ininiji15201972323";        replaceAllDemo(str,"\\d{5,}","#");//至少5个数字的,用#替换        replaceAllDemo("derkkserqquisedooo","(.)\\1+","&");//重复元素用&替换        replaceAllDemo("derkkserqquisedooo","(.)\\1+","$1");//使用$符号获取组成员 去除重复元素         }      public static void replaceAllDemo(String str,String reg,String newstr)    {        str=str.replaceAll(reg, newstr);//符合reg要求的,用newstr替换        System.out.println(str);    }}

结果:

wer#ininiji#

der&ser&uised&

derkserquisedo

 

         4、 获取功能

获取功能

 将字符串中符合规格的子串取出               

 操作步骤

 1、将正则表达式封装成对象

 2、让正则表达式关联字符串

 3、关联后,获取正则匹配引擎

 4、通过引擎对符合规则的紫船进行操作,比如取出。

import java.util.regex.*;public class H_05RegexGet {    public static void main(String[] args) {        getDemo("jin tian  tian qi  bu cuo  ming  tian  ");    }      public static void getDemo(String str)    {        String reg="\\b[a-zA-Z]{3}\\b";//连续3个字母        //将规则封装成对象        Pattern p=Pattern.compile(reg);        //让正则对象和药作用的字符串相关联,获取匹配器对象        Matcher m=p.matcher(str);        //String 中的matches方法就是调用了 Pattern和Matcher对象来完成的        //m.find();//将规则作用到字符串上,并进行判断        while(m.find())        {            System.out.println(m.group());            System.out.println(m.start()+"  "+m.end());            //返回子串的索引位置                }          }}

结果:

jin

0  3

cuo

22  25

3.       练习:

IP地址排序

        

import java.util.TreeSet;public class H_06RegexTest {    public static void main(String[] args) {        ipDemo("192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30");    }      public static void ipDemo(String str)    {        str=str.replaceAll("(\\d+)", "00$1");//1位或多位数字,前面补0        str=str.replaceAll("0*(\\d{3})", "$1");//前面是0个或者多个0,后面3位,替换为后面三位        String [] arr=str.split(" +");//用一个或者多个空格切割        TreeSet<String> ts=new TreeSet<String>();//直接存入TreeSet集合        for(String s:arr)        {            ts.add(s);        }        for(String s:ts)        {            System.out.println(s.replaceAll("0*(\\d+)", "$1"));//替换成不带零的,并打印        }    }
}

结果

2.2.2.2

8.109.90.30

10.10.10.10

102.49.23.13

192.68.1.254

 

4.       网页爬虫

需求

         获取指定文档中的邮件地址

         使用获取功能  Patten  Matcher

import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.InputStreamReader;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;import java.util.regex.Matcher;import java.util.regex.Pattern;public class H_08Spider{    public static void main(String[] args) throws Exception    {        getMail();    }    public static void getMail() throws Exception    {        URL url=new URL("http://tieba.baidu.com/p/2901562330");//地址封装        URLConnection conn=url.openConnection();//返回一个 URLConnection 对象        //conn.getInputStream()返回从此打开的连接读取的输入流。        BufferedReader bufIn=new BufferedReader(newInputStreamReader(conn.getInputStream(),"utf-8"));        String line=null;        //String reg="[\\W&&[\\S]]+";        //String reg="[\u4E00-\u9FA5]+";//汉字编码范围 可以获取汉字        String reg="\\w+@\\w+(\\.\\w+)";//定义获取邮箱的正则表达式        Pattern p=Pattern.compile(reg);            while((line=bufIn.readLine())!=null)        {            Matcher m=p.matcher(line);            while(m.find())            {                System.out.println(m.group());            }        }          }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java笔记