正则表达式

Posted yisany

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式相关的知识,希望对你有一定的参考价值。

正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。下面来介绍一些基本的规则


1. 正则基本语法

  • 首先有两个特殊的符号^$,他们分别表示一个字符串的开始和结束:

    • ^The:表示所有以“The”开始的字符串
    • pair$:表示所有以“pair”结尾的字符串
    • ^ab$:表示开头和结尾都是ab
    • notice:表示任何包含"notice"的字符串
  • *+?表示一个或一系列字符重复出现的次数,它们分别表示“0个、1个或若干”,“1个或若干”还有“0个或1个”。

    • ab*:表示一个字符串有一个a,后面跟着0个或者若干个b -> a,ab,abbbbb......
    • ab+:表示一个字符串有一个a,后面跟着至少一个b或者更多
    • ab?:表示一个字符串有一个a,后面跟着0个b或者1个b -> a,ab
    • a?b+$:表示在字符串末尾有0个a或者1个a,后面跟着至少1个b
  • {}大括号表示次数的范围

    • ab{2}:表示有1个a和2个b
    • ab{2,}:表示有1个a和至少2个b
    • ab{3,5}:表示有1个a和3到5个b

    必须指定范围的下限,上限可以忽略

  • |表示或操作

    • hi|hello:表示字符串中有"hi"或"hello"
    • (a|b)*c:表示一串"a"、"b"混合的字符串后面有一个c
  • .可以替代任何字符

    • a.[0-9]:表示有1个a后面跟着一个任意字符和一个数字
    • ^.{3}$:表示有任意三个字符的字符串
  • []方括号表示某些字符串允许在一个字符串中的某一特定位置出现

    • [ab]:表示有1个a或者1个b
    • [a-d]:表示一个字符串包含小写的a到d中的一个
    • ^[a-zA-Z]:表示以一个字母开头
    • ,[a-zA-Z0-9]:表示一个字符串以一个逗号后面跟着一个字母或数字结束
  • [^]可以在方括号中使用^表示不希望出现的字符,要放在方括号的第一位

    • %[^a-zA-Z]%:表示两个百分号中不应该出现字母
  • 转义符

    • 有时候我们输入{}在正则中也会被匹配,使用可以避免这种匹配


2. 正则字符简写式

  • :匹配单词的开始或者结束,单词边界
  • w:匹配字母或数字或下划线或汉字,等价[A-Za-z0-9_]
  • s:匹配任意的空白符
  • d:匹配数字
  • f:匹配换页符
  • :匹配回车符
  • :匹配换行符
  • :匹配水平制表符

以上都是小写字母,如果是大写字母,匹配内容就是相反的。例如s匹配空白符,S匹配除空白符外的所有字符。


3. 运算符优先级

正则表达式从左到右进行计算,并遵循优先级顺序。

相同优先级从左到右进行运算,不同优先级的运算先高后低。

下表从高到低说明了优先级顺序:

运算符 描述
转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, 任何元字符、任何字符 定位点和序列(即:位置和顺序)
| 替换,"或"操作


4. 正/反向预查

正向或反向预查都是非获取匹配,不进行存储供以后使用。

测试的文本:

Java6 Java7
  • 正向预查

    (?:pattern) 匹配结果。Java(?:6|7)等效于Java6|Java7,结果Java6 Java7

    (?=pattern) 正向匹配。Java(?=6),匹配后面跟着6的Java,即第一个Java,结果Java6 Java7

    (?!pattern)正向不匹配。Java(?!6),匹配后面不跟着6的Java,即第二个Java,结果Java6 Java7

  • 反向预查

    (?<=pattern) 反向匹配。(?<=J)a,匹配紧跟字母J后面的a,结果Java6 Java7

    (?<!pattern) 反向不匹配。(?<!J)a,不匹配紧跟字母J后面的a,结果Java6 Java7



最后附上 正则表达式手册







以上是关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

markdown 正则表达式模式片段

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

循环通过 python 正则表达式匹配

asp.net 使用正则表达式验证包含打开/关闭括号片段的属性字符串

攻破难啃的骨头-正则表达式(转)

正则表达式的贪婪和非贪婪模式