Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 483|回复: 0

[正则表达式学习]正则表达式简介

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-1 00:01:24 | 显示全部楼层 |阅读模式

    1 介绍
          
    正则表达式(Regular Expressions)描述了一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串、将匹配的子串做替换或者从某个字符串中取出符合某个条件的子串等。这样的表达式“^[+|-]?d*.d+$”,如果以前从没接触过,乍看的确像古老的咒语,只有巫师能懂。但这正是表达式的强大之所在,正则表达式把复杂的问题简单化,简单到只有几个字符。如果不理解规则,就会把简单的几个字符复杂化,复杂到不可理解,但如果理解规则,那么就会发现,表达式就是表达式,它的确就是几个符号,表达一个明确的意思。

    2 正则表达式的组成
           正则表达式由特殊字符以及普通字符组成,特殊字符是正则表达式规则定义的有特殊含义的字符,普通字符是除特殊字符外的所有打印和非打印字符。  
      
      
    1.     2.1 打印字符
    复制代码
    所有大小写字母,所有数字,所有标点符号,以及一些特殊符号。 2.2 非打印字符
       
         
          
          
            字符
            含义
          
          
            cx  
           匹配由x指明的控制字符。例如, cM 匹配一个 Control-M 或回车符。X 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 "c" 字符。
          
          
            f  
           匹配一个换页符。等价于 x0c 和 cL。
          
          
          
      
           匹配一个换行符。等价于 x0a 和 cJ。
          
          
          
      
           匹配一个回车符。等价于 x0d 和 cM。
          
          
           s  
           匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ f
            v]。
          
          
           S  
           匹配任何非空白字符。等价于 [^f
            v]。
          
          
                     
           匹配一个制表符。等价于 x09 和 cI。
          
          
           v  
           匹配一个垂直制表符。等价于 x0b 和 cK。
          
          
         
        2.3 特殊字符
        特殊字符是有特殊含义的字符,如果需要使用它的原义,必须在字符前使用“”进行转义(此处不再列举)。
        3 操作符优先级
        相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下:
         
          
          
            
            操作符
            描述
            
            
             
            转义符
            
            
            (), (?:), (?=), []  
            圆括号和方括号
            
            
            *, +, ?, {n}, {n,}, {n,m}  
            限定符
            
            
            ^, $, anymetacharacter  
            位置和顺序
            
            
            |  
            “或”操作
            
          
          
         4.正则表达式的简单示例4.1 基本模式匹配
         表达式“friend”匹配一个字符串中任何位置的“friend”。
         4.2 定位符匹配
         表达式“^friend$”只匹配“friend”字符串。其中^表示匹配字符串开始位置,$表示匹配字符串结束位置。
         4.3 字符簇匹配
          
           表达式“^[abcd]”匹配一个字符串中开始位置的a或b或c或d字符,只匹配一个字符。  表达式“^[^ab]”匹配一个字符串中开始位置的非a或b的字符,其中^在“[]”中表示“非”,而不是开始位置。  
           表达式“^[A-Z]”匹配一个字符串中开始位置的大写字符,其中“-”表示范围。   
          
         4.4重复次数
          
           表达式“ab{2}”匹配一个字符串中的“abb”,其中“{2}”表示前面的子表达式重复2次。  表达式“ab{0,}”匹配一个字符串中的a加任意多个b(包括0个),其中“{0,}”表示前面的子表达式重复0或多次,“*”也可以表示0或多次,所以也可以写成“ab*”。  表达式“ab{1,}”匹配一个字符串中的a加1个或任意多个b,其中“{1,}”表示前面的子表达式重复1次或多次,“+”也可以表示重复1次或多次,所以也可以写成“ab+”。  
           表达式“ab{0,1}”匹配一个字符串中的“a”或“ab”,其中“{0,1}”表示前面的子表达式重复0次或1次,“?”也可以表示0次或1次,所以也可以写成“ab?”。   
          
         4.5 正则表达式的贪婪性
         正则表达式默认总是尽可能多的匹配字符串,这种特性叫做正则表达式的贪婪性。例如表达式“a+”将匹配字符串“aaaaaaaa”中的所有a。如果想改变这种特性,可以使用“?”,使表达式尽可能少的匹配字符串。例如表达式“^a+?”将匹配字符串“aaaaaa”中的第一个a。
         4.6 一个实用例子
         前面提到的表达式“^[+|-]?d*.d+$”表示一个浮点数。^表示开始,[+|-]表示是+或-,?表示+-号有或没有,d*表示0或多位数字,.表示小数点,d+表示1或多位数字,$表示结束。
         5 正则表达式应用示例
         下面的例子,只是简单介绍正则表达式在javaScript、Java、C中的应用。虽然正则表达式有标准,但是在具体实现时,并非完全相同,还有一些差异,如果想更全面、深入的了解,请参考相关资料。
         5.1 正则表达式在JavaScript中的应用
          
             JavaScript中有一个RegExp类用来处理正则表达式,下面是一个例子,判断一个输入是否是浮点数:   
          
          
          
            
            <Script language=”JavaScript”>
         <!--
           function checkFloat(str) {
            var re = /^[+|-]?d*.d+$/;
            return re.test(str);
           }
         //-->
        </Script>  
            
          
          
          
             JavaScript中的String类也有一些函数用到正则表达式,下面是一个例子,将日期从yyyy-mm-dd格式转换成yyyy年mm月dd日格式:   
          
          
          
            
             <Script language=”JavaScript”>
    <!--
    function changeFormat(str) {
        return str.replace(/(d{4})-(d{2})-(d{2})/, "$1年$2月$3日");
      }
    //-->
    </Script>  
            
          
          
         5.2 正则表达式在Java中的应用
          
            Java中的java.util.regex包提供对正则表达式的支持,下面是一个例子,判断一个输入是否是浮点数:   
          
            
          
          
            
               public static boolean checkFloat(String str) {
            return Pattern.matches("^[+|-]?\d*\.\d+$", str);
            }  
            
          
          
             注意:在java语言中,String中的使用\表示。
          
                Java中的String类也有一些函数使用正则表达式,下面是一个例子,将日期从yyyy-mm-dd格式转换成yyyy年mm月dd日格式:   
          
             
          
          
            
              public static String changeFormat(String str) {
            return str.replaceAll("(\d{4})-(\d{2})-(\d{2})", "$1年$2月$3日");     }
            
          
          
         5.3 正则表达式在C语言中的应用
         需要包含两个头文件:sys/types.h、regex.h,有四个函数:regcomp编译表达式函数,regexec表达式处理函数,regerror错误处理函数,regfree释放资源。
          
           下面一个例子,判断一个输入是否是浮点数:   
          
          
          
            
             int checkFloat(char *str) {
            int     n;
            regex_t re;
            regmatch_t pm[10];
            char    buf[256], pattern[256];
            strcpy(pattern, "^[+|-]?[0-9]*\.[0-9]+$");
            n = regcomp(&re, pattern, REG_EXTENDED);

            if (n != 0) {
                  regerror(n, &re, buf, sizeof(buf));
                  fprintf(stderr, “err:[%d]%s”, n, buf);
                  return n;         }
             n = regexec(&re, str, sizeof(pm)/sizeof(regmatch_t), pm, 0);

             if (n != 0) {
                    if (n != REG_NOMATCH) {
                            regerror(n, &re, buf, sizeof(buf));
                      fprintf(stderr, “err:[%d]%s”, n, buf);
                    }
             }  
           regfree(&re);
            return n; }
            
          
          
          
            下面是一个例子,将日期从yyyy-mm-dd格式转换成yyyy年mm月dd日格式:   
          
          
          
            
            
    1. int changeFormat(char *str) {
    2.         int     n, i;
    3.         regex_t re;
    4.         regmatch_t pm[10];
    5.         char    buf[256], pattern[256];

    6.         strcpy(pattern, "([0-9]{4})-([0-9]{2})-([0-9]{2})");
    7.         n = regcomp(&re, pattern, REG_EXTENDED);
    8.         if (n != 0) {
    9.                 regerror(n, &re, buf, sizeof(buf));
    10.                 fprintf(stderr, "err:[%d]%s", n, buf);
    11.                 return n;
    12.         }
    13.         n = regexec(&re, str, sizeof(pm)/sizeof(regmatch_t), pm, 0);
    14.         if (n != 0) {
    15.                 if (n != REG_NOMATCH) {
    16.                         regerror(n, &re, buf, sizeof(buf));
    17.                         fprintf(stderr, "err:[%d]%s", n, buf);
    18.                 }
    19.         } else {
    20.                 memset(buf, 0x00, sizeof(buf));
    21.                 strncpy(buf, str + pm[1].rm_so, pm[1].rm_eo - pm[1].rm_so);
    22.                 strcat(buf, "年");
    23.                 strncat(buf, str + pm[2].rm_so, pm[2].rm_eo - pm[2].rm_so);
    24.                 strcat(buf, "月");
    25.                 strncat(buf, str + pm[3].rm_so, pm[3].rm_eo - pm[3].rm_so);
    26.                 strcat(buf, "日");
    27.                 strcpy(str, buf);
    28.         }
    29.         regfree(&re);

    30.         return n;
    31. }
    复制代码
      
            
          
          
         6 结束语
         正则表达式应用非常广泛,在字符串处理时,往往有意想不到的效果,但写出高技巧的表达式,往往需要一定的功底,。表达式其实不难,难的是记住它的规则,我认为最好的方法是多用,不需要死记规则,碰到不理解的规则查找资料,用多了就记住了。当然了,如果你超强能记住规则最好。另外,虽然有标准,但不同的地方还是有细微差别的,在使用时也需要注意。
         7 参考资料
         正则表达式标准:http://www.opengroup.org/onlinepubs/007908799/xbd/re.html网友笑容编写的《正则表达式(regular expression)》http://dev.csdn.net/develop/article/41/41299.shtm
         Jeffrey E.F.Friedl编写的《Mastering Regular Expressions》,这本书是正则表达式的极好资料,不过是E文的.
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 17:19 , Processed in 0.300181 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表