[转帖] 这grep咋还不支持\d呢(BRE,ERE,PCRE)

grep,支持,bre,ere,pcre · 浏览次数 : 0

小编点评

**简介** 该文章介绍了grep正则表达式分类,并解释了BRE、ERE、PCRE等正则表达式的区别。 **BRE(Basic Regular Expression)** * BRE 是 POSIX 标准定义的正则表达式。 * BRE 支持大多数字符,但不支持一些特殊字符。 * BRE 的模式匹配顺序是从左到右。 **ERE(Extended Regular Expression)** * ERE 是 BRE 的扩展版本。 * ERE 支持一些 BRE 不支持的字符,如括号、转义字符等。 * ERE 的模式匹配顺序从左到右。 **PCRE(Perl Compatible Regular Expression)** * PCRE 是 Perl 中的正则表达式。 * PCRE 支持大多数 BRE 和 ERE 支持的字符。 * PCRE 的模式匹配顺序从左到右。 **主要区别** | 特征 | BRE | ERE | PCRE | |---|---|---|---| | 正则表达式类型 | BRE | ERE | PCRE | | 支持字符 |大多数字符 | BRE、ERE、PCRE | BRE、ERE、PCRE | | 模式匹配顺序 | 从左到右 | 从左到右 | 从左到右 | | 捕获组 | 不支持 | 支持 | 支持 | | 反向引用 | 不支持 | 支持 | 支持 | | 懒惰匹配 | 不支持 | 支持 | 支持 | **总结** grep 正则表达式分类是基于正则表达式的分类标准,不同正则表达式支持的字符和模式不同。了解这些分类标准可以帮助你选择合适的正则表达式来匹配文本数据。

正文

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对比#

功能描述BREEREPCRE
字符组 匹配指定任一字符 [..] [..] [..]
排除字符组 匹配非指定任一字符 [^..] [^..] [^..]
简写字符组.号 匹配非换行字符 . . .
简写字符组 匹配数字
匹配非数字
不支持 不支持 \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)相似的内容:

[转帖] 这grep咋还不支持\d呢(BRE,ERE,PCRE)

https://www.cnblogs.com/codelogs/p/16060372.html 简介# 对于刚使用Linux不久的同学,肯定会遇到这个问题,就是用grep匹配数字时,发现\d匹配不了数字。 主要原因是grep支持三种正则表达式BRE,ERE,PCRE,而其默认使用的是BRE,但\d

[转帖]Linux中的grep -v、-e、-E用法小结

https://www.jb51.net/article/266590.htm grep是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来,这篇文章主要介绍了Linux之grep -v、-e、-E用法总结,需要的朋友可以参考下 + 目录 简介 grep (global sea

[转帖]别催了,别催了,这篇文章我一次性把 Shell 的内容说完

https://my.oschina.net/jiagoushi/blog/6037198 Shell 搜索与匹配 1、在文件中查找字符串 grep 命令可以搜索文件,查找指定的字符串。 $ grep myvar *.c 在这个例子中,我们搜索的文件全都位于当前目录下。因此,我们只使用了简单的 sh

[转帖] Linux命令拾遗-文本处理篇

https://www.cnblogs.com/codelogs/p/16060413.html 简介# 这是Linux命令拾遗系列的第二篇,本篇主要介绍Linux中与文本处理相关的命令,如xargs、grep、sed、awk等。 本系列文章索引Linux命令拾遗-入门篇 常用文本相关命令# cat

[转帖] Linux文本命令技巧(上)

Linux文本命令技巧(上) 原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介# 前一篇我介绍了awk,这是一个全能的文本处理神器,因为它本身就是一门编程语言了,但对于很多场景,使用Linux预设的一些文本处理命令,会更方便快捷,如grep、sed等。本篇就来介绍

[转帖] q命令-用SQL分析文本文件

https://www.cnblogs.com/codelogs/p/16060830.html 简介# 在Linux上分析文本文件时,一般会使用到grep、sed、awk、sort、uniq等命令,但这些命令都有一定的学习成本,而如果是用SQL来分析数据的话,这对广大后端程序员来说,就要简单很多了

[转帖]这批半导体项目,赔了夫人又折兵

https://m.thepaper.cn/baijiahao_13062359 中国工业科技新闻的权威观察家 文 科工力量专栏作者 铁流 提供对中国高新技术企业和产品的专业点评 日前,业内传闻“济南泉芯”已经烂尾。近年来,国内出现了德淮半导体、武汉弘芯、贵州华芯通等一批关门或烂尾的半导体项目,堪称

[转帖]原来这就是帕金森时间定律,很多人竟然还不知道,为生命加快脚步

https://baijiahao.baidu.com/s?id=1673564759668576951&wfr=spider&for=pc 2020-07-29 23:15名师,皖蒙城县双涧中学,优质文化领域创作者,活力创作者 关注 在别人做一件事的时间里,你能够做几件事?是更多还是更少?事半功倍

[转帖]用了这18种方案,接口性能提高了100倍!

https://juejin.cn/post/7167153109158854687 前言 大家好,我是捡田螺的小男孩。 之前工作中,遇到一个504超时问题。原因是因为接口耗时过长,超过nginx配置的10秒。然后 真枪实弹搞了一次接口性能优化,最后接口从11.3s降为170ms。本文将跟小伙伴们分

[转帖]Oracle数据库中ITL详解

首先说明这篇文章是转载的,原文地址:http://blog.sina.com.cn/s/blog_616b428f0100lwvq.html 1、什么是ITL ITL(Interested Transaction List)是Oracle数据块内部的一个组成部分,用来记录该块所有发生的事务,一个it