Java正则表达式入门基础篇

                    Java正则表达式入门基础篇

             正则表达式是什么呢,在网上可以搜到很多版本的定义,大致官方的定义便是: 正则表达式,又称规则表达式(Regular Expression,在代码中常简写为regex、regexp或RE),是一种用于操作字符串的规则,其中这些规则使用了一些字符表示,有自己特殊的应用,其作用就是针对于字符串进行操作;正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

              上面这个就是比较通俗的官方定义了,作为一个入门级的小白,我个人对正则表达式的理解就是:它是类似于数据库的查询语句的一种语法规则,数据库的查询语句通过select,group,order by等可以实现自己想要的符合条件的数据,而正则表达式就和它的道理类似,不同之处就是正则表达式是用一些定义好的字符,通过这些字符来实现对一些字符串文本等的检索,过滤掉不符合你编写的程序要求的,替换,匹配,切割等操作来完成自己的程序。再简单点就是比如要判断一个手机号码是不是合法的(是否是11位,是否是数字等),编写代码判断需要好多行的代码,而用正则表达式只用一行代码就可以搞定而且判断的还很全面,这个时候就可以体现出正则表达式的用途和优点了。

               正则表达式也算是一种语法,个人觉得想要快速理解的方法就是由简单的例子入手外加简单的语法,先从迷糊迷糊不知所云的定义走到实例中,有了一点具体的理解后,再慢慢由浅入深,深入探究正则表达式的规则语法实用场景等。不再废话,举一个简单的例子吧,

     比如北京固定电话都是010-XXXXXX这样的格式,用正则表达式表示获取到的固定电话是否符合要求格式如下:010-\d\d\d\d\d\d\d\d

或者可表示为:010-\d{8}

下面介绍这句话的语法:\d匹配0~9的所有数字

                      {}用于标记前面子表达式的出现频度

第一种表示方式先是010-,然后是8个数字(\d)

第二种表示方式先是010-然后 \d{8}就是连续匹配八次数字的意思

相比之下要比写一段代码来判断电话号码是否符合要简单多了。

大致明白了正则表达式之后,就来简单看一下它规定的一些语法,


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

X*X,             零次或多次

X+X,             一次或多次

X{n}X,            恰好n次

X{n,}X,           至少n次

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

[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](减去)

大致了解一点语法后,就用几个例子来运用一下加强理解吧

一、需求:只能输入数字

//不用正则表达式

public class Demo2{

  public static void main(String[] args) {

     //只能输入数字

    String str = "124354232";

     char[] arr = str.toCharArray();

     boolean flag = true;

     for(inti = 0 ;  i

        if(!(arr[i]>=48&&arr[i]<=57)){

          flag = false;

        }

     }

     System.out.println(flag?"输入正确":"输出只能是数字");

   }

}

//使用正则表达式

publicclassDemo2{

   publicstaticvoidmain(String[] args) {

     //只能输入数字

     Stringstr = "12435423a2";

     booleanflag = str.matches("[0-9]+");

     System.out.println(flag?"输入正确":"只能输入数字");

   }

}

二、需求:校验QQ号,要求:必须是5~15位数字,0不能开头。

//没有正则表达式之前

publicstaticvoidcheckQQ(Stringqq)

       {

              intlen = qq.length();

              if(len>=5 && len<=15)

              {

                     if(!qq.startsWith("0"))

                     {

                            try

                            {

                                   longl= Long.parseLong(qq);

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

                            }            

                            catch(NumberFormatException e)

                            {

                                   System.out.println("出现非法字符");

                            }

                     }

                     else

                            System.out.println("不可以0开头");

              }

              else

                     System.out.println("QQ号长度错误");

       }

/*有了正则表达式之后:

[1-9][0-9]{4,14}   [1-9]表示是第一位数字是会出现1-9范围之间的其中一个,下来的数字范围会出现在0-9之间,至少出现4次,最多出现14次。*/

publicstaticvoidcheckQQ2()        

{                                    

String qq = "12345";             

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

booleanb = qq.matches(reg);     

System.out.println("b="+b);                                 

}  

三、需求:匹配是否为一个合法的手机号码。

publicstaticvoidcheckTel()

{                                                                              

String tel = "25800001111";                                                 

String reg = "1[35]\\d{9}";//在字符串中,定义正则出现\ 要一对出现。        

booleanb= tel.matches(reg); 

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

}                                                                              

四、根据空格对一段字符串进行切割。

publicstaticvoidsplitDemo()                             

   {                                                          

     Stringstr = "aa.bb.cc";                               

     str= "-1     99    4   23";                          

     String[]arr = str.split(" +");                        

     for(Strings : arr)                                    

     {                                                       

        System.out.println(s);                             

     }                                                      

   } 

五、需求:把手机号替换成“*”号

String str = "联系我:13425678901联系我:13425678901联系我:13425678901联系我:13425678901联系我:13425678901";

     Stringreg= "1[34578]\\d{9}";

     str=   str.replaceAll(reg,"******");

     System.out.println("替换后的帖子:"+ str);


上述例子中用到了一些方法,这些方法都是String类中提供的几个特殊方法:

boolean matches(String regex):判断该字符串是否匹配指定的正则表达式

String replaceAll(String regex,String replacement):返回该字符串中所有匹配正则表达式的子串替换成replacement后的新字符串。

String replaceFirst(String regex,String replacement):返回该字符串中第一个匹配正则表达式的子串替换成replacement后的新字符串。

String[] split(String regex):根据给定的正则表达式拆分该字符串后得到的字符串数组。

          此外,Java提供了Pattern和Matcher类专门用于提供正则表达式支持。Pattern对象是正则表达式编译后在内存中的表示形式,因此,正则表达式字符串必须先被编译成Pattern对象,然后再利用该Pattern对象创建对应的Matcher对象,执行匹配所涉及的状态保留在Matcher对象中,多个Matcher对象可共享同一个Pattern对象。典型的调用顺序如下:

Pattern p =Pattern.compile("a*b");

    Matcher m = p.matcher("aaaaab");

    boolean b = m.matches();

Matcher类提供了如下几个常用方法:

find:返回目标字符串中是否包含与Pattern匹配的子串

group:返回上一次与Pattern匹配的子串

start:返回上一次与Pattern匹配的子串在目标字符串中开始位置

end:返回上一次与Pattern匹配的子串在目标字符串中结束位置加1

lookingAt:返回目标字符串前面部分与Pattern是否匹配

matches:返回整个目标字符串与Pattern是否匹配

reset:可以将现有的Matcher对象应用于一个新的字符序列。

下面通过例子来说明方法的用途

//想要获取由3个字母组成的单词。

public static void getDemo()

   {

     String str = "da jia zhu

yi le,ming tian bu fang jia,xie xie!";

     //这时我们要用到一些正则对象。

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

      Pattern p = Pattern.compile(reg);

     Matcher m = p.matcher(str);

     while(m.find())

     {    System.out.println(m.start()+"...."+m.end());    System.out.println("sub:"+str.substring(m.start(),m.end()));

        System.out.println(m.group());

     }//在使用group方法之前,必须要先找,找到了才可以取。

   }

例二、校验邮件

public static void checkMail()

   {

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

String reg ="[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";   

  boolean b =mail.matches(reg);

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

   }

以上这些基本上就是正则表达式的基础入门了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 1.正则表达式介绍 正则表达式算起来也是一个很庞大的语言系统,在所有的开发语言中基本都支持正则表达式,它可以很方便...
    babybus_superdo阅读 2,558评论 3 6
  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,148评论 1 44
  • 近日风雨如晦,几无过年气息,思及昔年,浑噩而过,唯观稚童,无知好奇,天真至纯,几离于此浮躁。而今蜀地初雪,实乃奇观...
    短歌行_0919阅读 204评论 0 1
  • 前些天看见慧莹姨在微博上很好的总结了她这一年,才想起,一年一总结的这个习惯已经让我扔下了好多年。 可能发生的事情太...
    WNjessica阅读 320评论 0 0
  • 从小,H就是别人家的孩子,她是家长口中的好孩子,老师口里的好学生,邻居口中的好闺女,于是,慢慢地,什么在她那里都有...
    倾铜阅读 250评论 0 1