`
yuanzher
  • 浏览: 30724 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

正则表达式基础

 
阅读更多

正则表达式定义

     正则表达式,Regular Expression,也常被简写为regex,regexp或RE.
     通常用一个正则表达式描述一个特征,然后去验证其他字符串是否符合这个特征.
     正则表达式也常被称作一个模式(pattern).
     
     PS:正则表达式精确的语法可能会因程序语言或工具的不同而有所差异.
     PPS:本文是学习之记录,如有不妥还望指正.
         
 

普通字符和特殊字符

     字符分为普通字符和特殊字符.
     特殊字符也被称为元字符.
    
     普通字符匹配与自身完全相同的一个字符,如字母,数字等.
     什么样的字符叫普通字符呢?除了特殊的,就是普通的,所以本文后面提到的都是特殊的.
     通常有一些表可以查询:
 
     如何表示特殊符号本身?
     特殊字符前面加反斜杠(\)时表示自身.比如特殊字符^,$等,前面加上\,就表示这个符号本身.
     (可能正反斜杠不太容易记忆,所以可以记为右手斜杠).
     \就是转义字符,普通加转义变成特殊的,如\d;特殊加转义变成普通的,如\$.
 

常用元字符

     \d匹配一位数字.(因为它是digit的首字母).
     \w匹配字母或数字或下划线或汉字等.(联想tip:可能是”字”word的首字母).
     \s匹配任意的空白符,包括空格,Tab,换行.(可能因为是space的首字母).
     \b代表单词分界处(比如空格,标点符号和换行等),\b不匹配这些符号,只匹配一个位置.(这个想不出为什么了,难道是begin?blank?).
     .匹配除了换行之外的任意字符.
 
     上面几个常用元字符的大写字母形式则是其反义,比如\D匹配任意非数字的字符,其他\W,\S,\B的意思可以类推.
 
     一些不便被表示的符号(非打印字符)用转义字符表示,如:
     \r,\n代表回车和换行符.
     \t代表制表符.
     

字符集 (中括号[]的使用)

     字符集合用方括号组织.
     []中可以罗列元素,如[aeiou]匹配任何一个原因字母.[]中可以包含任意多个字符,可以匹配其中任意一个,但是只能是一个.
     [^]是反向字符集,如[^xyz]匹配除了xyz之外的任意一个字符.
     正反向的字符集都可以划定范围.比如[0-9][0-9a-z][^A-F0-3]等等.
     但是永远要记得:不管方括号[]里面有多少内容,它永远都只匹配一个字符作为匹配内容.
     要匹配多个字符,需要用数量限定符.
 

分组 (小括号()的使用)

     中括号介绍完了之后就是小括号了.
     小括号是用来分组的, ()符号:
     1.在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰;
     2.取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到.
     总而言之,小括号标记了子表达式的开始和结尾,可以保存子表达式以备将来之用.
     
     小括号的另一种用途是通过语法(?#comment)来包含注释.
 
 

指定数量的限定符 (大括号{}用在这里)

     *代表前面的内容出现0次到多次.
     +代表前面的内容出现1次到多次.
     ?代表前面的内容出现0次或1次.
     {n}代表前面的内容重复n次(不能多也不能少).
     {n,}代表前面的内容重复n次或更多次.
     {n,m}代表前面的内容重复n到m次.
     
     正则表达式默认是贪婪匹配,即匹配尽可能多的字符,比如a.*b它会匹配以a开始,以b结束的最长的字符串.
     但是有时候我们需要懒惰匹配(非贪婪匹配),也即匹配尽可能少得字符,要实现这个效果,只要在数量限定符的后面跟上一个问号?.
  这样a.*?b会匹配以a开始,以b结束的最短的字符串.
 
 

匹配

    一般的正则匹配:当被检测的字符串包含的某个部分符合正则表达式的描述时,称为匹配成功;符合匹配的部分即是匹配到的内容. 
     但是如果加上^$限定匹配字符串的开头和结尾,则必须是整个字符串匹配,匹配才能成功.
     比如\d是表示数字,\d{5,12}只能保证字符串里包含5到12连续位数字,而^\d{5,12}&则保证整个字符串就是5到12位数字.
     ^,$\b都是用来进行边界匹配的,它们本身并不匹配任何字符.
 

分支条件

     用|可以把不同的规则分隔开.左右两边表达式是或的关系,即匹配左边或者右边,可以在多个项之间进行选择.
     匹配分支条件时会采取短路原则,即如果前面某个分支已经满足,则不会再测试后面的分支条件.
 
 

后向引用

     前面介绍的小括号的使用,用来分组,以备后续使用,这里就要介绍怎么使用.
     表达式在匹配的时候,会将小括号包含的表达式所匹配到的字符串记录下来,在获取匹配结果的时候,小括号表达式匹配的字符串可以单独获取.
     小括号匹配到的字符串,不仅是在匹配结束后才能使用,在匹配过程中也可以使用.
     这样就可以匹配重复出现的单词等.
 
     表达式后面的部分,可以引用前面”括号内的子匹配已经匹配到的字符串”,引用方法是反斜杠\加上一个数字.
     \1引用第一对括号内匹配到的字符串, \2引用第二对. 比较特殊的是分组0对应整个正则表达式.
     如果有嵌套的括号,则外层的括号先排序号(即按照左括号的顺序排序).
 
     也可以自己指定子表达式的组名,语法是:(?<name>exp),其中<>换成单引号也行.
     引用自己指定名字的子表达式:\k<name>
     组号分配时扫描两遍,第一遍给未命名的组分配,第二遍给命名了的组分配组号.
     使用(?:exp)将不捕获匹配的文本,也不给此组分配编号.
     
 

零宽断言和负向零宽断言

     断言指定了一个条件(可能是正向条件或者负向条件),然后零宽表示所占宽度为零,即自身并不被包含在匹配结果里,就好像\b,^,$等.
     两个正向条件的, 即零宽断言:
     (?=exp)零宽度正预测先行断言,它断言自身出现的位置后面能匹配表达式exp.
          比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分.
     (?<=exp)零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp.
          比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分.
     两个负向条件的, 即负向零宽断言:
     (?!exp)零宽度负预测先行断言,断言此位置的后面不能匹配表达式exp.
          比如\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字.
     (?<!exp)零宽度负后顾后发断言,断言此位置的前面不能匹配表达式exp.
          比如(?<![a-z]\d{7})匹配前面不是小写字母的七位数字.
     
     
     
 

参考资料

     正则表达式30分钟入门教程:
     wikipedia:
     揭开正则表达式的神秘面纱:
     msdn正则表达式语法:
 
 
     正则表达式测试网站:
     多种语言的正则表达式在线测试:
     JavaScript正则测试:
     regex101:
     正则表达式状态机生成器:
 
 
分享到:
评论

相关推荐

    Python正则表达式基础

    Python正则表达式基础是学习如何在Python中应用正则表达式的入门指南。正则表达式,或称为REs、regexes、regexpatterns,是能够嵌入到Python中的一个精细、高度专业化的程序语言。通过re模块,程序员得以使用这一...

    vb正则表达式实例(正则表达式测试程序)

    1. 正则表达式基础 - **模式匹配**:正则表达式是一种特殊的字符序列,用于定义字符串的搜索模式。 - **元字符**:如 `.`(任意单个字符)、`*`(零个或多个前面的字符)、`+`(一个或多个前面的字符)、`?`(零个...

    groovy正则表达式基础1

    【Groovy正则表达式基础1】 Groovy是一种基于Java平台的动态编程语言,它扩展了Java的功能,包括对正则表达式的处理。在Groovy中,正则表达式是通过`~`运算符或者使用斜杠(`/`)来定义的。这种特性使得Groovy在处理...

    正则表达式测试工具C#版(src)

    1. **C#中的正则表达式基础** - `System.Text.RegularExpressions`命名空间:C#中的正则表达式操作主要基于这个命名空间下的类和方法。 - `Regex`类:这是处理正则表达式的核心类,提供了多种与正则相关的静态方法...

    易语言正则表达式文本替换

    1. **正则表达式基础** - **元字符**:如`.`表示任意字符,`^`表示行首,`$`表示行尾,`\d`代表数字,`\w`代表字母或数字,`\s`代表空白字符。 - **量词**:如`*`表示前面的元素零次或多次,`+`表示一次或多次,`?...

    精通正则表达式(第三版)简体中文版

    ### 正则表达式基础知识与应用 #### 一、正则表达式的定义及用途 正则表达式(Regular Expression)是一种强大的文本处理工具,能够帮助用户查找、替换以及操作特定的字符串或字符组合。它在多种编程语言和操作...

    通过正则表达式生成数据

    一、正则表达式基础 1. **基本元素**:正则表达式由一系列字符和特殊符号组成,如字母、数字、特殊字符以及元字符(如`.`、`*`、`+`、`?`、`^`、`$`、`|`、`()`、`[]`、`\`等)。 2. **量词**:`*`表示零个或多个...

    正则表达式基础学习笔记

    正则表达式(Regular Expression,简称regex)是用于...通过熟练掌握上述基础知识,你将能够编写出高效且精准的正则表达式,大大提高文本处理的效率。在实际应用中,不断实践和积累经验,是成为正则表达式高手的关键。

    测试正则表达式软件

    首先,让我们了解一下Java中的正则表达式基础。在Java中,`java.util.regex`包提供了对正则表达式的支持。主要涉及以下核心类: 1. **Pattern**:表示一个正则表达式模式,可以通过`Pattern.compile(String regex)`...

    01C#正则表达式基础教程.doc

    **正则表达式基础教程** 1. **本文目标** 本教程旨在为C#开发者提供正则表达式的基础知识,帮助理解正则表达式的概念、语法和常见用途。通过学习,你将能够编写和使用正则表达式进行文本匹配、验证和处理。 2. **...

    vba正则表达式基础

    vba正则表达式基础知识介绍,由浅入深,实例讲解

    详细的C#正则表达式基础教程

    本教程将深入探讨C#中的正则表达式基础,帮助你掌握这一核心技能。 1. **正则表达式简介** 正则表达式(Regular Expression)是一种模式匹配语言,用于在字符串中查找、替换或捕获特定模式。它通过一套特殊语法来...

    Java使用正则表达式提取XML节点内容的方法示例

    但是,正则表达式也是一种非常复杂的技术,需要开发者具备一定的基础知识和经验。 为了帮助开发者更好地掌握Java正则表达式技术,我们提供了一系列的Java正则表达式技巧大全,包括《Java正则表达式技巧大全》、...

    第11.25节 Python正则表达式编译re.compile及正则对象使用.rar

    ### 正则表达式基础 正则表达式(Regular Expression)是一种特殊的字符串序列,用于描述一种模式。在Python中,`re`模块提供了对正则表达式的支持。正则表达式的基本元素包括: 1. 字符匹配:如`.`匹配任意单个...

    C#字符串和正则表达式参考手册

    1. 正则表达式基础:正则表达式是一种模式匹配工具,用于在字符串中搜索、替换和提取特定模式。 2. 正则表达式对象:在C#中,使用`System.Text.RegularExpressions`命名空间下的`Regex`类来处理正则表达式。 3. ...

    正则表达式基础正则表达式基础

    正则表达式(Regular Expression,简称regex)是用于匹配字符串的一种模式,广泛应用于文本处理、数据验证、搜索和替换...在“正则表达式基础.ppt”这个文件中,应该包含了更详细的讲解,可以帮助你深入理解这一主题。

    IP地址的正则表达式

    ### 正则表达式基础 正则表达式是一种强大的文本处理工具,主要用于字符串搜索、替换以及提取等操作。通过特定的字符组合,正则表达式能够匹配符合某种模式的字符串。在处理IP地址时,正则表达式可以帮助我们验证一...

    使用正则表达式拆分字符串

    1. 正则表达式基础 - **模式匹配**:正则表达式由一系列字符和特殊符号组成,用于定义一个模式,该模式可以匹配特定的字符串。 - **元字符**:如`*`, `+`, `?`, `{}`, `[]`, `\`等,它们具有特殊的含义,用于指定...

    delphi xe 10 正则表达式

    一、正则表达式基础 正则表达式(Regular Expression)是一种特殊的字符串模式,用于在文本中搜索匹配该模式的字符串。它们由一系列字符和特殊符号组成,这些符号代表了不同的匹配规则。例如,`\d`表示任何数字,`^...

Global site tag (gtag.js) - Google Analytics