https://www.cnblogs.com/codelogs/p/16060372.html

简介#

对于刚使用Linux不久的同学,肯定会遇到这个问题,就是用grep匹配数字时,发现\d匹配不了数字。

主要原因是grep支持三种正则表达式BRE,ERE,PCRE,而其默认使用的是BRE,但\d是定义在PCRE中的,所以grep默认是不支持\d的。

正则表达式分类#

BRE
基本的正则表达式(Basic Regular Expression 简称 BRE),由posix标准定义,为了统一历史上混乱的正则实现。

ERE
扩展的正则表达式(Extended Regular Expression 简称 ERE),由posix标准定义,解决了一些BRE的缺陷并补充了一些新功能。

PCRE
Perl兼容的正则表达式(Perl Compatible Regular Expression 简称 PCRE),由perl语言发展而来,而后移植到各平台与编程语言中,所以称其为Perl兼容的正则表达式。

如今主流编程语言(java,python)中的正则实现,基本都是PCRE,PCRE功能也比BRE,ERE要强大得多,虽然大部分同学只知道其基础部分。

BRE,ERE,PCRE对比#

功能 描述 BRE ERE PCRE
字符组 匹配指定任一字符 [..] [..] [..]
排除字符组 匹配非指定任一字符 [^..] [^..] [^..]
简写字符组.号 匹配非换行字符 . . .
简写字符组 匹配数字
匹配非数字
不支持 不支持 \d \D
简写字符组 匹配字母数据下划线
匹配非字母数字下划线
\w \W \w \W \w \W
简写字符组 匹配空白符
匹配非空白符
\s \S \s \S \s \S
匹配量词 匹配0次或多次 * * *
匹配量词 匹配1次或多次 \+ + +
匹配量词 匹配0次或1次 \? ? ?
匹配量词 匹配x次
匹配x次或以上
匹配x次或以上y次或以下
\{x\} \{x,\} \{x,y\} {x} {x,} {x,y} {x} {x,} {x,y}
懒惰匹配量词 尽量不匹配 不支持 不支持 *? +? ?? {x}? {x,}? {x,y}?
占有匹配量词 匹配后就不会回溯 不支持 不支持 *+ ++ ?+ {x}+ {x,}+ {x,y}+
位置限定 匹配行开头位置 ^ ^ ^
位置限定 匹配行结尾位置 $ $ $
位置限定 匹配单词边界
匹配非单词边界
\b \B \b \B \b \B
多选结构 多选匹配条件 | ` `
捕获组与反向引用 分组并捕获 \(...\) \1 \2 (...) \1 \2 (...) \1 \2
仅分组 仅分组不捕获括号 不支持 不支持 (?:)
固化分组 匹配后就不回溯的分组 不支持 不支持 (?>)
环视 零长度断言 不支持 不支持 (?=...) (?!...) (?<=...) (?<!...)

可以发现BRE与ERE的主要区别是,BRE对于+,?,{x},|,(),需要使用\转义后,才能表达正则的含义,否则视为普通字符,而ERE默认表示正则元字符,加\才是普通字符。

另外,对于我们常用的\d,BRE与ERE都不支持。

命令与它们的正则分类#

grep
对于grep,默认使用BRE,grep -Eegrep使用ERE,实际上grep -Eegrep是等价的,grep -P使用PCRE。

另外,值得一提的是grep -F代表普通字符串匹配,grep -w代表单词模式匹配,如grep -w abc等价于grep '\babc\b',其中\b用于匹配单词边界。

sed
对于sed,默认也使用BRE,sed -Esed -r使用ERE,sed不支持PCRE。

awk
对于awk来说,默认就是ERE,它不支持BRE与PCRE。

另外,PCRE发布了两个新的轮子pcregreppcre2grep,功能上类似于grep,不过是专门用PCRE规范实现的,pcre2grep有个好用的功能,可以很方便的使用正则提取数据,如下:

$ echo -e 'name:zhangsan,age:18 \n name:lisi,age:20' | pcre2grep -O '$1 $2' 'name:(\w+),age:(\d+)'
zhangsan 18
lisi 20

往期内容#

不容易自己琢磨出来的正则表达式用法
原来awk真是神器啊
Linux文本命令技巧(上)
Linux文本命令技巧(下)
字符编码解惑

[转帖] 这grep咋还不支持\d呢(BRE,ERE,PCRE)的更多相关文章

  1. BAE3.0还不支持本地写入文件

    BAE3.0对比2.0做了很大的改动,对于安装应用方面也方便了很多,普通的应用表面上(下文就是讲为什么说表面上)不需要做什么适配.比如wp博客,直接修改wp-config.php,把数据库信息填一下就 ...

  2. 字符转码开源库libiconv目前还不支持64位

    最新版的libiconv 1.14目前还不支持64位系统,只能编译出32位库. libiconv 1.14下载地址: http://ftp.gnu.org/pub/gnu/libiconv/libic ...

  3. linux(5)--补充(管道| / 重定向> / xargs)/find 与xargs结合使用/vi,grep,sed,awk(支持正则表达式的工具程序)

    本节中正则表达式的工具程序 grep,sed和awk是重点,也是难点!!! 先补充一下一. 管道| / 重定向> / xargs 如:1. 管道和重定向的区别:具体可以见 http://www. ...

  4. [转帖].NET Framework各版本操作系统支持

    .NET Framework .NET版本 1.0 1.1 2.0 3.0 3.5 4.0 4.5 完整版本 1.0.3705.0 1.1.4322.573 2.0.50727.42 3.0.4506 ...

  5. [转帖]订购微软Windows 7延长支持服务的报价曝光 第三年要价两百美金

    订购微软Windows 7延长支持服务的报价曝光 第三年要价两百美金 cnbeta 年2月份的新闻 https://www.cnbeta.com/articles/tech/815885.htm 微软 ...

  6. jsp页面实现上传文件,并且还得支持断点续传的功能

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...

  7. Java前端Rsa公钥加密,后端Rsa私钥解密(目前还不支持中文加密解密,其他都行)

    Base64工具类,可以让rsa编码的乱码变成一串字符序列 package com.utils; import java.io.ByteArrayInputStream; import java.io ...

  8. [转帖].net 4.8 将不再支持win7 win8 版本

    ZT:https://blogs.msdn.microsoft.com/dotnet/2018/07/18/announcing-net-framework-4-8-early-access-buil ...

  9. 【推荐】CentOS安装Subversion-1.8.11+HTTP协议支持配置

    注:以下所有操作均在CentOS 6.5 x86_64位系统下完成. 我们需要搭建一个自己的SVN服务器. 此外,搭建好的SVN服务器除了需要支持svn协议外,最好还需要支持HTTP协议和HTTPS协 ...

  10. linux管道命令grep命令参数及用法详解---附使用案例|grep

    功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...

随机推荐

  1. Java 创建/编辑/删除Excel迷你图表

    迷你图是Excel工作表单元格中表示数据的微型图表.使用迷你图可以非常直观的显示数据变化趋势,突出最大值.最小值,放在数据表格中可起到很好的数据分析效果.本文将通过Java代码示例介绍如何在Excel ...

  2. 总是记不住java的IO流用法?用N个问题教你掌握java IO流

    摘要:Java IO 体系看起来类很多,感觉很复杂,但其实是 IO 涉及的因素太多了.在设计 IO 相关的类时,编写者也不是从同一个方面考虑的,所以会给人一种很乱的感觉,并且还有设计模式的使用,更加难 ...

  3. 13个VSCode使用技巧,开启高效的开发模式

    摘要:VsCode是一款开源的编辑器,拥有强大的功能,.由于拥有各种各样的插件,这就使得VsCode可以做到的事情更多了.在使用的过程中,也是有很多技巧的,掌握一些技巧对于后期写代码也会轻松很多. 本 ...

  4. vue2升级vue3: h、createVNode、render、createApp使用

    h.createVNode 杂乱笔记,凑合着看,不喜勿喷! h 函数是什么 h 函数本质就是 createElement() 的简写,作用是根据配置创建对应的虚拟节点,在vue 中占有极其重要的地位! ...

  5. 手写签名-微信小程序

    index.wxml <canvas type="2d" id="canvas" bindtouchmove="move" bindt ...

  6. 阿里OSS文件访问变成下载

    将 ECS 挂载 OSS 多Bucket ,进行文件存储后,发现PDF.图片在浏览器中访问URL,变成了下载,页不是预览. 1. 解决办法,文件类型 application/octet-stream  ...

  7. 如何通过命令部署.Net

    如何通过命令部署.net3.5组件服务 问题:系统安装.net一直报错,无法安装该功能. 问题现象: 终极解决方案: 将windows10系统镜像文件拷贝在硬盘或者U盘中,鼠标右击选择"装载 ...

  8. 【每日一题】33. 简单瞎搞题 (滚动数组 + bitset 优化DP)

    补题链接:Here 这个问题的难点在于如何统计出所有和可能出现的情况,并且不能重复. 很容易想到用桶去存储每一个数,即某个和能够组合出来则为1,否则为0 不妨令 \(dp[i][j]\) 表示为第 \ ...

  9. 区间dp专题小结

    区间DP是一类在区间上进行动态规划的最优问题,一般是根据问题设出一个表示状态的 dp,可以是二维的也可以是三维的,一般情况下为二维.然后将问题划分成两个子问题,也就是一段区间分成左右两个区间,然后将左 ...

  10. Java项目配置Maven依赖时不知需要的最低jdk版本?(报错java: 错误: 无效的目标发行版:17)

    1.问题 在配置SpringBoot项目依赖时,使用了最新的spring-boot-starter-parent 3.1.5,但是出现了java: 错误: 无效的目标发行版:17的报错 2.解决 经过 ...