黑马程序员——Java基础---正则表达式

本文详细介绍了正则表达式的概念、作用、弊端、特点及常见符号类、预定义字符类、贪婪数量词、边界匹配器等。通过实际操作方法如匹配、切割、替换、获取等,展示了正则表达式在简化字符串操作过程中的强大能力。
------<a href=" http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

1.概述

1>正则表达式:符合一定规则的表达式

2>作用:用于专门操作字符串。可以简化对字符串的操作。

3>弊端:符号越多,定义越长,不易阅读。

4>特点:用于一些特定的符号来表示一些代码操作。

5>常用正则表达式

a>字符类

[abc]            ab c(简单类)

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

[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,除了 b c[ad-z](减去)

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

b>预定义字符类

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

\d    数字:[0-9]

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

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

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

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

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

c>Greedy 数量词

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

X*      X,零次或多次

X+      X,一次或多次

X{n}    X,恰好 n

X{n,}    X,至少 n

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

d>边界匹配器

^    行的开头

$    行的结尾

\b   单词边界

\B   非单词边界

\A   输入的开头

\G   上一个匹配的结尾

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

\z   输入的结尾

2.操作方法

1>匹配:String matches(String regex)方法,用规则匹配整个字符串,只要有一处不符合就匹配结束返回flase

2>切割:String split(String regex) 

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

例:String str = "qwweffrgggyjjjg";

String reg = "(.)\\1+";//任意字符出现多次

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

1--->((A)(B(C)))    2--->\A     3--->(B(C))    4--->(C)

 

3>替换:String replaceAll(String regex, String replacement)将字符串中符合规则regex不服替换成另外部分replacement

 

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

步骤:a>将正则表达式封装成对象 Pattern p =Pattern.compile(reg)

  b>让正则对象和要操作的字符串关联 Matcher  m = p.matcher(str);

  c>关联后获取正则匹配引擎  m.find()m.group()

find():将规则作用到字符串上,并进行符合规则的子串查找。

group():用于获取匹配后结果

  d>通过引擎对符合规则的子串进行操作

publicclass RegexDemo {

 

   publicstaticvoid main(String[] args) {

      // TODO Auto-generated methodstub

      demo();

      demo2();

      splitDemo("zhangsan,lishi,wangwu",",");

      splitDemo("zhangsan.lishi.wangwu","\\.");//注意转义

      splitDemo("c:\\abc\\a.txt","\\\\");//注意转义

      //按照叠词完成切割。

      splitDemo("qwweffrgggyjjjg","(.)\\1+");

      //将字符串中连续出现一次或一次以上的数字替换成“*

      replaceAllDemo("wu12gu43u5","\\d{1,}","*");

//将重复字母只保留一个,多余的删除"$1":获取第一组

replaceAllDemo("qwweffrgggyjjjg","(.)\\1+","$1");

      getDemo();

   }

   publicstaticvoid getDemo()

   {

      String str = "ads fdfe fds dfdsfd";

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

      //将规则封装成对象

      Pattern p = Pattern.compile(reg);

      //让正则对象和要作用的字符串相关联。获取匹配对象

      Matcher m = p.matcher(str);

     

      while(m.find())

      {

         System.out.print(m.group()+"\t");

      }

      System.out.println();

   }

   publicstaticvoid replaceAllDemo(String str,String reg,String newStr)

   {

      str = str.replaceAll(reg,newStr);

      System.out.println(str);

   }

   publicstaticvoid demo()

   {

      String str = "bc";

      //定义的规则为第一个字母必须是a或b或c;第二个只能是小写字母

      String reg = "[bcd][a-z]";

      System.out.println(str.matches(reg));

   }

   publicstaticvoid demo2()

   {

      String str = "2123245";

      //第一位是1-9,后面有4-14位都是数字

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

      System.out.println(str.matches(reg));

   }

   publicstaticvoid splitDemo(String str,String reg)

   {

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

      for(String s : arr)

      {

         System.out.print(s+"\t");

      }

      System.out.println();

   }

}

3.正则的思路      

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

2>想要按照自己的方式将字符串变成多个字符串,使用切割。获取规则以外的子串

3>要想将已有的字符串变成另一个字符串,使用替换

4>想要拿到符合要求的字符串子串,获取。获取符合规则的子串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值