黑马程序员-java基础之正则表达式

本文介绍了正则表达式的概念及其在字符串操作中的应用,详细解释了各种符号、字符类和预定义类的作用,并提供了匹配、切割、替换及获取字符串的具体实例。

--------------------- android培训java培训、java学习型技术博客、期待与您交流! -------------------

正则表达式

概念:符合一定规则的表达式。用于操作字符串

特点:用于一些特定的符号来表示一些代码操作,这样可以简化书写。所以学习正则表达式,就是在学习一些特殊符号的使用。

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

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

常见符号

1、字符

x                          字符 x

\\                         反斜线字符

\t                         制表符 ('\u0009')

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

\r                         回车符 ('\u000D')

\f                         换页符 ('\u000C')

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

2、字符类

[abc]                    ab c(简单类)

[^abc]                  任何字符,除了 abc(否定)

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

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

[a-z&&[def]]               de f(交集)

[a-z&&[^bc]]        a z,除了 bc[ad-z](减去)

[a-z&&[^m-p]]     a z,而非 mp[a-lq-z](减去)

3、字符运算符优先级,从高到低

字面值转义    \x

分组          […]

范围                     a-z

并集                     [a-e][i-u]

交集                     [a-z&&[aeiou]]

 

4、预定义字符类

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

\d                         数字:[0-9]

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

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

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

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

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

5、边界匹配器

^                          行的开头

$                          行的结尾

\b                         单词边界

\B                        非单词边界

\A                        输入的开头

\G                       上一个匹配的结尾

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

\z                         输入的结尾

6Greedy数量词

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

X* X,          零次或多次

X+ X,         一次或多次

X{n} X,        恰好 n

X{n,} X,       至少 n

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

7、组和捕获

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

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

2 \A

3 (B(C))

4 (C)

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

三具体操作功能

1匹配:String 的matches()方法,将正则传入,用规则匹配整个字符串,只要有一处不符合规则,匹配结束返回flase

代码示例

定义一个QQ号码的匹配

定义一个手机号码的匹配

class RegexDemo

{

public static void main(String[] args)

{

        String qq = "123k4567";

        String regex = "[1-9][0-9]{4,14}";//正则表达式。

        boolean b = qq.matches(regex);     

        System.out.println(qq+":"+b);

        //匹配手机号码是否正确。

        String tel = "15800001111";

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

        boolean b = tel.matches(regex);

        System.out.println(tel+":"+b);

    }  

}

2切割:String的split()方法,按照叠词切割时,为了可以让规则的结果重用,可以将规则封装成一个组,用()完成,组的出现都有编号从1开始,重复使用组,可以通过\n(n代表组的编号),替换时想要重复使用组可以使用$n。

代码示例 从叠词处切割

class RegexDemo2

{

public static void main(String[] args)

{

        String str = "wwwjinqqqwanttdaiilaouuuhu";

       

        String[] names = str.split("(.)\\1+");//str.split("\\.");

       

        for(String name : names){

            System.out.println(name);

}

}

3替换:String的replaceAll()

代码示例将叠词替换成单个

class RegexDemo3

{

public static void main(String[] args)

{

        String str = "jinnnnwwwwandddddallllaohhhu";

        str = str.replaceAll("(.)\\1+", "$1");

        System.out.println(str);

}

}

 

4获取:将字符串中符合规则的子串取出

操作步骤:

将正则封装成对象

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

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

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

代码示例

class RegexDemo3

{

public static void main(String[] args)

{

 

        String str = "da jia hao,ming tian bu fang jia!";

       

        String regex = "\\b[a-z]{3}\\b";

       

        //1,将正则封装成对象。

        Pattern p = Pattern.compile(regex);

        //2, 通过正则对象获取匹配器对象。

        Matcher m = p.matcher(str);

       

        //使用Matcher对象的方法对字符串进行操作。

        //既然要获取三个字母组成的单词

        //查找。 find();

        System.out.println(str);

        while(m.find()){

            System.out.println(m.group());//获取匹配的子序列

           

            System.out.println(m.start()+":"+m.end());

        }

    }

实际使用时,到底使用哪一个功能,或哪几个功能

思路方式

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

2如果想要将已有字符串变成另一个字符串,使用匹配

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

4如果想要拿到符合需求的字符串子串,使用获取,获取符合 规则的子串。

小练习 ip地址排序

class RegexDemo5

{

public static void main(String[] args)

{

       String ip_str = "192.168.10.34  127.0.0.1  3.3.3.3  105.70.11.55";

             

    //1,为了让ip可以按照字符串顺序比较,只要让ip的每一段的位数相同。

       //所以,补零,按照每一位所需做多0进行补充。每一段都加两个0.

      

       ip_str = ip_str.replaceAll("(\\d+)", "00$1");

       System.out.println(ip_str);

      

       //然后每一段保留数字3位。

       ip_str = ip_str.replaceAll("0*(\\d{3})", "$1");

       System.out.println(ip_str);

      

      

       //1,将ip地址切出。

       String[] ips = ip_str.split(" +");

      

       TreeSet<String> ts = new TreeSet<String>();

      

       for(String  ip : ips)

{

//         System.out.println(ip);

           ts.add(ip);

       }

       for(String ip : ts)

{

           System.out.println(ip.replaceAll("0*(\\d+)", "$1"));

       }

    }

}

小练习 邮箱校验

对邮件地址校验。

class RegexDemo5

{

public static void main(String[] args)

{

       String mail = "abc1@sina.com.cn";

      

       String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]{1,3})+";

       //第二种方式,这种方式会出现1@1.1也能校验成功

       //regex = "\\w+@\\w+(\\.\\w+)+";

       //最随意简单的校验

       Mail.indexOf("@")!=-1

      

       boolean b = mail.matches(regex);

       System.out.println(mail+":"+b);

    }

}

小练习 网页爬虫获取邮箱

public class RegexDemo5

{

    public static void main(String[] args) throws IOException

{

 

        List<String> list = getMailsByWeb();

      

       for(String mail : list)

{

           System.out.println(mail);

       }

    }

    public static List<String>  getMails() throws IOException

{

       //1,读取源文件。

       BufferedReader bufr =

new BufferedReader(new FileReader("c:\\mail.html"));

       //2,对读取的数据进行规则的匹配。从中获取符合规则的数据.

       String mail_regex = "\\w+@\\w+(\\.\\w+)+";

       List<String> list = new ArrayList<String>();

       Pattern p = Pattern.compile(mail_regex);

       String line = null;

       while((line=bufr.readLine())!=null)

{

           Matcher m = p.matcher(line);

           while(m.find())

{

              //3,将符合规则的数据存储到集合中。

              list.add(m.group());

           }

       }

       return list;

       }

}

--------------------- android培训java培训、java学习型技术博客、期待与您交流! -------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值