正则表达式

350 阅读5分钟

正则表达式:是处理字符串的⼀种表达⽅式。提供了⼀种从⼀组字符串中 选择特定字符串的机制。

POSIX规范定义了UNIX操作系统应当⽀持的功能,POSIX规范的正则表达 式:

  1. BRE(Basic Regular Expression,基本型正则表达式)
  2. ERE(Extended Regular Express,扩展型正则表达式)

BRE和ERE⼆者的区别,简单的说就在于(、)、{、}、+、?、|这7个特殊字符的使⽤⽅法上:

  1. 在BRE中如果想要这些字符表示特殊的含义,就需要把它们转义。元字符 (、)、{、}、 +、?、| 必须转义之后才具有特殊含义,如+、?、|,⽽且也⽀持\1、\2之类反向引⽤。

  2. 反之,在ERE中如果要这些字符不表示特殊的含义,就需要把它们转义。虽然BRE名为“基本”⽽ERE名为“扩展”,但ERE并不要求兼容BRE的语法,⽽是⾃成⼀体。

  3. BRE中的特殊字符:.、\、[、^、$、*。

  4. ERE中的特殊字符多了7个,即:.、\、[、^、$、*、(、)、{、}、+、?、|。

正则表达式与通配符没有任何关系,不是包含关系!

  1. 通配符,是Shell提供的功能
  2. 正则表达式只是⽤来处理字符串

如何学习正则表达式?

  1. 背:一些特殊意义的符号
  2. 实际练习:先按规矩写一些简单的

我们看一个简单的正则表达式:

直抒胸臆操作符:

  • cat:字符串Cat,属于串联
  • c:字符C

渣男操作符:

  • . :匹配所有的字符:除了newline和null

重复操作符:

  • * :匹配前一个元素0次或多次,除了换行
  • + :匹配前一个元素1次或多次
  • ? :匹配前一个元素0次或1次

间隔操作符:

  • {count}:匹配前一个元素count次
  • {min,} : 匹配前一个元素只是min次
  • {min,max} :匹配前一个元素只是min,至多max次

备胎操作符:

  • | :匹配前一个表达式或后一个表达式,有一个能匹配上就可以

列表操作符:([...] and [^...]):

一般操作符在列表操作符里会失去特殊意义,除了下面这些可以生效,其他都没用:

  • ] : 结束列表。[]]
  • \ :转义字符
  • [: :字符类别操作符开始
  • :] :字符类别操作符结束
  • :范围操作符,例如0-9

字符列表操作符([:...:]):

特殊字符类别操作符:

范围操作符:

  • :匹配指定范围,但是需在列表中使用并指定范围,如[a-z]。[-az]或者[az-]标示匹配a和z,还有-

分组/捕获组操作符((...) or (..)):

定义一个子表达式。正则表达式将此序列视为一个单元。圆括号在整体匹配完后进行匹配,可以配合反向引用操作符,重复使用分组匹配的结果

反向引用操作符 ((\digit)):

反向引用操作符由‘\数字’表示,数组需介于1-9,代表引用那个分组的匹配结果,数字代表几次

锚点操作符:

  • ^ : 匹配字符串的开头,需在开头
  • $ : 匹配字符串的结尾或者换行符的前一个位置,需在结尾

如果^在列表操作符中使用,并且在首位,代表取反

操作符优先级:

下面的内容在部分语言中不支持

每种环境,无论是Python、Perl、Java、C#、Ruby还是其他,在实现正则表达式时都有特殊的差别,swift也不例外

Objective-C和Swift都要求您转义⽂字字符串中的特殊字符(即,在它们 前⾯加反斜杠\字符)。反斜杠本身就是这样的特殊字符之⼀!由于⽤于创建 正则表达式的模式也是字符串,因此会增加复杂性,因为在使⽤Stringand时 需要转义反斜杠字符NSRegularExpression。

这意味着标准正则表达式.将出现\.在您的Swift(或Objective-C)代码中。

  1. ⽂字”\.”定义了⼀个类似于以下字符串:.
  2. 正则表达式.然后将匹配单个句点字符。

贪婪模式、勉强模式与侵占模式:

贪婪匹配用的最多

举个例子:

假定要分析的字符串是xfooxxxxxxxfoo

贪婪模式:

也就是最开始* 是通配符,会把所有的字符都匹配完,这就导致foo没有字符去匹配了,所以需要签名的* 留出一个字符给foo去匹配,入股匹配不上再留一个

勉强模式:

最开始不匹配,然后foo去匹配,foo匹配不成功的话,* ?会匹配一个字符,剩下的再让foo去匹配,以此类推

侵占模式:

占有模式= 勉强模式与侵占模式

简单的说,贪婪模式和占有模式相比,贪婪模式会在只有部分匹配成功的条件下,依次从多到少减少匹配成功部分模式的匹配数量,将字符留给模式其他部分去匹配;而占有模式则是占有所有能匹配成功部分,绝不留给其他部分使用

高级用法:

零宽断言:

断言:在指定位置应该满足一定的条件

当捕获组以开头?=,,表示该组江北用作零宽度正预测先行断言,仅当前一个模式与捕获组中俄模式相匹配时才与前一个模式匹配。例如,A(?=B)与A匹配,并且,马上跟着B。可以匹配AB、ABB、ACB

匹配特定类别的Unicode字符\p{...}:

\p{L}所有字符,\p{Lu}所有小写字符,\p{N}。

\P{}匹配不特定类别的Unicode字符。

执行正则的命令:

grep:

  • -v:逆转显示
  • -i:忽略大小写
  • -A:向上显示几行
  • -B:向下显示几行
  • -E:启用扩展
  • -color:显示颜色

egrep:grep -E

其他命令

sed:可以将数据进行替换、删除、新增、选取特定内容等功能,用作一整行字符处理。

awk:比sed更精准,通常将一行在切割成相应的字段,再去处理