正则表达式:是处理字符串的⼀种表达⽅式。提供了⼀种从⼀组字符串中 选择特定字符串的机制。
POSIX规范定义了UNIX操作系统应当⽀持的功能,POSIX规范的正则表达 式:
- BRE(Basic Regular Expression,基本型正则表达式)
- ERE(Extended Regular Express,扩展型正则表达式)
BRE和ERE⼆者的区别,简单的说就在于(、)、{、}、+、?、|这7个特殊字符的使⽤⽅法上:
-
在BRE中如果想要这些字符表示特殊的含义,就需要把它们转义。元字符 (、)、{、}、 +、?、| 必须转义之后才具有特殊含义,如+、?、|,⽽且也⽀持\1、\2之类反向引⽤。
-
反之,在ERE中如果要这些字符不表示特殊的含义,就需要把它们转义。虽然BRE名为“基本”⽽ERE名为“扩展”,但ERE并不要求兼容BRE的语法,⽽是⾃成⼀体。
-
BRE中的特殊字符:.、\、[、^、$、*。
-
ERE中的特殊字符多了7个,即:.、\、[、^、$、*、(、)、{、}、+、?、|。
正则表达式与通配符没有任何关系,不是包含关系!
- 通配符,是Shell提供的功能
- 正则表达式只是⽤来处理字符串
如何学习正则表达式?
- 背:一些特殊意义的符号
- 实际练习:先按规矩写一些简单的
我们看一个简单的正则表达式:
直抒胸臆操作符:
- 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)代码中。
- ⽂字”\.”定义了⼀个类似于以下字符串:.
- 正则表达式.然后将匹配单个句点字符。
贪婪模式、勉强模式与侵占模式:
贪婪匹配用的最多
举个例子:
假定要分析的字符串是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更精准,通常将一行在切割成相应的字段,再去处理