java基础_14_正则表达式

来源:互联网 发布:linux help分段显示 编辑:程序博客网 时间:2024/04/30 09:29
正则表达式 (Pattern)  

用于对字符串进行操作。

 

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

弊端:符号定义越多,正则越长,阅读性越差

 

注意:在写预定义字符类时 \和字母都是一个整体,\本身是一个转义字符,所以如\d 要写成 \\d  

 

常用功能:

1,匹配 matches(String regex)

匹配过程中只要有一个不符全规则,就结束,返回false 

例:

要求:一串数字  1,长度为5-10    20不能开头   3,帐号只能是数字

    public void method(String qq)    {    String regex = "[1-9][0-9]{4,9}";     /*     意思:第一位数在1-9之间,第二位数在0-9之间,第二位可以有4-9个数字。    {}表示数量,看java.util.regex或 matches(String regex)    */    boolean flag = qq.matches(regex);    if(flag)    System.out.println("qq "+qq);    else    System.out.println("帐号不对");    }

要求:匹配电话号码:开头只能是 13*******;15******;或18*******

String regex = "1[358][0-9]{9}";

或写成String regex = "1[358]\\d{9}"; 

//解说:第一位必须是1,第二位只能是358,第三位开始只能是9位且满足0-9

 

网页爬虫(蜘蛛)

       --> 把满足邮箱格式的邮箱给取出来

    public void getMails_2()  throws Exception    {    URL url = new URL("http://www.baidu.com");        URLConnection uc = url.openConnection();  //获取连接        BufferedReader bufr =     new BufferedReader(new InputStreamReader(uc.getInputStream()));        String mailregex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";    Pattern p = Pattern.compile(mailregex);        String line = null;    while ((line=bufr.readLine())!=null)    {    Matcher m = p.matcher(line);    while (m.find())  //按规则,满足返回true,并指向下一位    {    System.out.println(m.group());    }    }    }

2,切割 split(String regex)

以一定规则把字符串进行切割。返回字符数组。

例:

String[] arr = str.split(regex);

regex = " +" ;  以一个或多个空格切割

"\\.";   以 . 切割,注意:在正则中.表示任意,所以要加\\转义

"\\\\"    以 \\ 切割

 

以叠词切割  -->  "(.)\\1"   (.)\1 切割 因为放在字符串中,转义所以要写成(.)\\1  

.)是任意的意思\1是一组的意思

 

3,替换 replaceAll(String regex, String replacement)

例:

将字符串中数字连续>=5个的变成一个#

replaceAll(str,"\\d{5,}","#");

 

将叠词 替换成 *

replaceAll(str,"(.)\\1+","*");

 

注意:用()表示分组的意思,$表示保留这个分组

如:我我要要要学学学学   变成:我要学

replaceAll((.)\\1,$1);

$1表示:替换成()这个组里面的。

 

例:将 112.46.33.3  IP地址每段补两个0  如 : 00112.0046.0033.003

replaceAll("([0-9]+)","00$1");

 

使其都保留成3

replaceAll("0*([0-9]{3})","$1");

 

心得:还可以使用替换功能来去掉字符串中不想要的字符

如:我。。。。要学  变成:我要学

str.replaceAll(\\.,””);

 

4,获取 compile 将字符串中的符合规则的子串取出。

操作步骤:

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

Pattern p = Pattern.compile(regex);

 

2,让正则对象和要操作的字符串相关联

Matcher m = p.matcher(str);

 

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

boolean b = m.find(); //将规则作用到字符串上,并进行符合规则的子串查找,有就返回true.

 

4,通过引擎对符合规则的子串进行操作,比如取出

m.group();

例:

找出字符串中单词长度为3的单词

    String str = "ming tian jiu yao   fang jia le ,da jiao-shi";        String regex = "\\b[a-z]{3}\\b";      \b是单词边界        Pattern p = Pattern.compile(regex);        Matcher m = p.matcher(str);        while (m.find()) //如果满足规则,就返回true,并往指向下一个子串    {    System.out.println(m.group());    System.out.println("--------"+m.start()+"....."+m.end());//取出单词前后的角下标    }

 

如何选取所须要的方法?

1,如果只是想知道字符是否对错,用匹配。

2,想要将已有字符变成另一个字符串,用替换。

3,想要按照自定的方式将字符串变成多个子字符串,用切割。

4,想要拿到符合需求的字符串的子串,用获取。

 

心得:在操作字符串的时候,使用正则表达式来完成。很方便。

0 0
原创粉丝点击