linux正则表达式

正则表达式是一种符号表示法,被用来识别文本模式。它以行为单位进行字符串的处理操作

编程语言(java、perl和python)、Linux实用工具(比如vi、sed编辑器、gawk程序和grep工具)以及主流应用(比如MySQL和PostgreSQL数据库服务器)可能会用不同类型的正则表达式

正则表达式是通过正则表达式引擎实现的,在Linux中有两种流行的正则表达式引擎:

  • POSIX基础正则表达式引擎,BRE引擎
  • POSIX扩展正则表达式引擎,ERE引擎

基础正则表达式——BRE模式

BRE模式的元字符是:锚字符、点号字符、字符组、星号

1.纯文本

正则表达式模式都区分大小写,空格和其他的字符没有区别。

2.特殊字符

正则表达式识别的特殊字符包括:.*[]^${}\+?|()

只要特殊字符作为文本字符,就必须转义,即在特殊字符前面加转义符(反斜杠\)。

匹配词,而不是匹配字符,使用\<word\>,因为<>需要表示匹配word单词的功能时必须转义。这样就会单词匹配了。例如匹配love单词,则只会匹配l love China,而不会匹配My gloves are red。

3.锚字符 ^ $

 有两个特殊字符可以用来将模式锁定在数据流中的行首或行尾,脱字符(^),美元符($)。

脱字符使用时必须将它放在正则表达式的前面,若在模式开头的其他位置,则和普通字符一样了。

美元符使用时必须将它放在正则表达式的结尾,若在模式结尾的其他位置,则和普通字符一样了。

4.点号字符  .

.用来匹配除换行符之外的任意单个字符,它必须匹配一个字符。

 5.字符组 []

(1)使用方括号来定义一个字符组。比如[12345]

(2)排除型字符组:只需要在字符组的开头加个脱字符,比如[^12345],注意!在正则表达式中是普通字符,不能表达反向选择。

(3)区间:用单破折号在字符组中表示字符区间,适合数字、大小写字母。比如[12-5]

(4)特殊字符组:使用特殊字符组用来匹配特定类型的字符,如下:

BRE特殊字符组
描述
[:alnum:]匹配任何字母数字。等价于A-Za-z0-9
[:word:]于[[:alnum:]]相同,但增加了下划线字符
[:alpha:]字母字符,等价于A-Za-z
[:blank:]包含空格和tab字符
[:digit:]数字0-9
[:graph:]

可视字符,在ASCII中,它包含33到126的字符

[:print:]可打印字符,在[[:graph:]]中的所有字符,再加上空格字符
[:lower:]小写字母a-z
[:upper:]大写字母A-Z
[:space:]匹配任意空白字符:空格、制表符、回车、换行等价于\t\r\n\v\f
[:punct:]匹配标点符号

例如,一个字符串是否是一句话,即字符串开始于一个大写字母,然后包含任意多个大写小写的字母和空格,最后以句号收尾。

[[:upper:]][[:upper:][:lower:] ]*\.

排除型字符,比如[^[:upper:]]排除A-Z之外的其他字符,一定要且必需要匹配一个字符,空格字符属于这个范围。

6.星号 *

星号前面的字符可以出现0次或者多次。

点号特殊字符和星号特殊字符的组合能匹配任意数量的任意字符。它通常用在数据流中两个可能相邻或不相邻的文本字符串之间。

星号用在字符组上时,它可以指定文本中出现多次的字符组或者字符区间,比如[abc]*,[a-c]*,[[:lower:]]*.

扩展正则表达式——ERE模式

在BRE模式的基础上扩展了元字符。

注意,只有在用反斜杠进行转义的情况下,字符“(”、“)”、“{”和“}”才会在扩展正则表达式(ERE)中被当作元字符处理,而在基本正则表达式(BRE)中,任何元字符前面加上反斜杠反而会使其被当作普通字符来处理

1.问号 ?

问号前面的字符可以出现0次或者1次,是限定符。

2.加号 +

加号前面的字符可以出现1次或者多次,但至少出现1次。

3.花括号 {}

匹配特定个数的元素。{m}匹配前面的元素,准确出现m次;{m,n}匹配前面的元素至少出现m次,至多n次;{m,}匹配前面的元素,至少出现m次;{,n}匹配前面的元素,至多出现n次。

\{m,n\},\{m\},\{m,\},\{,n\}

因为{}符号在shell中也是有特殊意义的,因此,必须使用转义符\让它失去特殊意义,仅生效正则匹配的功能。比如grep -n 'o\{2,5\}' regular_express.txt  在txt文本中找到至少两个oo,最多5个o的字符串。

4.管道符号 |

用逻辑或方式指定正则表达式引擎要用的两个或多个模式。

正则表达式和管道符号之间不能有空格,否则空格也会被认为正则表达模式的一部分,管道符号两侧的正则表达式可以采用任何正则表达模式(包括字符组)来定义文本。

格式是expr1|expr2|expr3|...

5.表达式分组()

用圆括号进行分组。分组时,该组会被视为一个标准字符,可以像对普通字符一样给该组字符使用特殊字符,比如Sat(urday)?,可以匹配完整的Saturday或者Sat。

常见地,会将分组和管道符号一起使用来创建可能的模式匹配组。比如(c|b)a(b|t),可以匹配第一组中字母的任意组合以及第二组字母的任意组合,即cab,cat,bab,bat。

常见地,和加号一起使用,表示多个重复群组的判别。比如,echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C';表示开头是A结尾是C,中间有一个以上的xyz字符串。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值