Java正则表达式

来源:互联网 发布:淘宝网国际转运服务 编辑:程序博客网 时间:2024/05/17 21:04


一、概述

其实是用来操作字符串的一些规则。

好处:正则的出现,对字符串的复杂操作变得更为简单。

特点:将对字符串操作的代码用一些符号来表示。只要使用了指定符号,就可以调用底层的代码对字符串进行操作。符号的出现,简化了代码的书写。

弊端:符号的出现虽然简化了书写,但是却降低了阅读性。

其实更多是用正则解决字符串操作的问题。 

组:用小括号标示,每定义一个小括号,就是一个组,而且有自动编号,从1开始。

只要使用组,对应的数字就是使用该组的内容。别忘了,数组要加\\。

(aaa(wwww(ccc))(eee))技巧,从左括号开始数即可。有几个左括号就是几组。

 

二、常见操作

1,匹配

其实用的就是String类中的matches方法。

String reg = "[1-9][0-9]{4,14}";

boolean b = qq.matches(reg);//将正则和字符串关联对字符串进行匹配。

示例:

class  MatchesDemo{/*对QQ号码进行校验要求:5~15  0不能开头,只能是数字*///方式一,不用正则表达式public static void qqCheck_1(String qq){if (!qq.startsWith("0")){if (qq.length()>=5&&qq.length()<=15){try{Long l=Long.parseLong(qq);//利用封装基本数据类型出现非数字报异常的特点System.out.println(qq);}catch (NumberFormatException e){System.out.println("包含非法字符!");}}elseSystem.out.println("你输入的长度非法!");}elseSystem.out.println("没有0开头的号码,请重输!");}//方式二,用正则来实现public static void qqCheck_2(String qq){String regex="[1-9]\\d{4,14}";if (qq.matches(regex))//用String类中matches方法来匹配{System.out.println(qq);}elseSystem.out.println(qq+":是非法的号码!"); }  /*匹配手机号段只有 13xxx 15xxx 18xxxx*/ public static void phoneCheck(String phone){String regex="1[358]\\d{9}";if (phone.matches(regex)){System.out.println(phone+":::is ok..");}elseSystem.out.println("手机号码输入有误!");}  public static void main(String[] args) {String qq="125696";qqCheck_1(qq);//不用正则的方式qqCheck_2(qq);//用正则的方式 String phone="13345678910";phoneCheck(phone);//匹配手机号码是否正确}} 


2,切割

其实用的就是String类中的split方法。

按叠词完成切割:为了让规则被重用,可将规则封装成一个组,用()完成。组的出现都有编号,从1开始。想要使用已有的组可通过\n(n就是组的编号)的形式来获取。

示例:

class SplitDemo { public static void main(String[] args) {String regex1="\\.";//按 .切String regex2=" +";//按空格切,可能有一个空格或者多个空格String regex3="(.)\\1+";//按照出现两次或者以上的叠词切String[] arr="192.168.1.62".split(regex1);//按 . 切print(arr); arr ="wo  shi   shui    545  21     3".split(regex2);//按空格切print(arr); arr="erkktyqqquizzzzzo".split(regex3);//按叠词切print(arr);} //遍历public static void print(String[] arr){for (String s : arr){System.out.println(s);}}}  


3,替换

其实用的就是String类中的replaceAll();

对于组中所匹配的字符,可以用$n来获取。$在正则中表示行的结尾,所以出现在正则中不能用来表示组,一般用于替换中。如以下案例:

class ReplaceDemo {public static void main(String[] args) {String regex1="\\d{5,}";//将字符串中数字替换成#String regex2="(.)\\1+";//将叠词替换为一个 String s1="erej569831217woshi2659810wosxs12356f";s1=s1.replaceAll(regex1,"#");//将字符串中的数字替换成# String s2="erkktyqqquizzzzzo";s2=s2.replaceAll(regex2,"$1");//将叠词替换为一个,其中$1表示符合组中一个字符 System.out.println("s1:"+s1);System.out.println("s2:"+s2);}} 


4,获取:

1),先要将正则表达式编译成正则对象。使用的是Pattern中静态方法 compile(regex);

2),通过Pattern对象获取Matcher对象。Pattern用于描述正则表达式,可以对正则表达式进行解析。而将规则操作字符串,需要从新封装到匹配器对象Matcher中。然后使用Matcher对象的方法来操作字符串。

如何获取匹配器对象

通过Pattern对象中的matcher方法。该方法可以正则规则和字符串想关联。并返回匹配器对象。

3),使用Matcher对象中的方法即可对字符串进行各种正则操作。

 

示例:

import java .util.regex.*;class  PatternDemo{public static void main(String[] args) {String s= "ming tian jiu yao fang jia le ,da jia。";String regex="\\b[a-z]{4}\\b";get(s,regex);}public static void get(String s,String regex){//将规则封装成对象。Pattern p=Pattern.compile(regex);//让正则对象和要作用的字符串相关联。获取匹配器对象。Matcher m=p.matcher(s); //System.out.println(m.matches());//其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。//只不过被String的方法封装后,用起来较为简单。但是功能却单一。 while(m.find())//find()方法是将规则作用到字符串上,并进行符合规则的子串查找。{System.out.println(m.group());//group()方法用于获取匹配后结果。System.out.println(m.start()+"...."+m.end());//start()和end()分别表示匹配字符的开始和结尾的索引}}} 


三、常见规则

1、字符

        x                  字符 x

        \\                 反斜线字符

        \t                 制表符 ('\u0009')

        \n                 新行(换行)符 ('\u000A')

        \r                 回车符 ('\u000D')

        \f                 换页符 ('\u000C')

        \a                 报警 (bell) 符 ('\u0007')

2字符类

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

        [^abc]                 任何字符,除了 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](减去)

3、预定义字符类

        .                         任何字符(与行结束符可能匹配也可能不匹配)

        \d                        数字:[0-9]

        \D                       非数字: [^0-9]

        \s                        空白字符:[ \t\n\x0B\f\r]

        \S                       非空白字符:[^\s] 

        \w                       单词字符:[a-zA-Z_0-9]

        \W                      非单词字符:[^\w]

4、边界匹配器

        ^                         行的开头

        $                         行的结尾

        \b                        单词边界

        \B                       非单词边界

        \A                       输入的开头

        \G                       上一个匹配的结尾

        \Z                       输入的结尾,仅用于最后的结束符(如果有的话)

        \z                        输入的结尾

5、Greedy数量词

        X?                       X,一次或一次也没有

        X*                       X,零次或多次

        X+                       X,一次或多次

        X{n}                    X,恰好 n次

        X{n,}                   X,至少 n次

        X{n,m}                X,至少 n次,但是不超过 m 次

6、组和捕获

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

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

                    2     \A

                    3     (B(C))

                    4     (C)

       组零始终代表整个表达式。在替换中常用$匹配组的内容。


0 0