首页 > 其他分享 >正则中常见的流派及其特性

正则中常见的流派及其特性

时间:2023-09-05 21:38:01浏览次数:43  
标签:PCRE 标准 特性 ERE 正则 POSIX BRE 流派

目前正则表达式主要有两大流派(Flavor):POSIX 流派与 PCRE 流派。

1、 POSIX 流派

POSIX 规范定义了正则表达式的两种标准:

  • BRE 标准(Basic Regular Expression 基本正则表达式);
  • ERE 标准(Extended Regular Expression 扩展正则表达式)。

我们现在使用的 Linux 发行版,大多都集成了 GNU 套件。GNU 在实现 POSIX 标准时,做了一定的扩展,主要有以下三点扩展。

  1. GNU BRE 支持了 +、?,但转义了才表示特殊含义,即需要用\+、\?表示。
  2. GNU BRE 支持管道符多选分支结构,同样需要转义,即用 \|表示。
  3. GNU ERE 也支持使用反引用,和 BRE 一样,使用 \1、\2…\9 表示。

浅黄色背景是 BRE 和 ERE 不同的地方,三处天蓝色字体是 GNU 扩展。

正则中常见的流派及其特性_正则表达式

POSIX 流派还有一个特殊的地方,就是有自己的字符组,叫 POSIX 字符组。这个类似于我们之前学习的 \d 表示数字,\s 表示空白符等,POSIX 中也定义了一系列的字符组。具体的清单和解释如下所示:

正则中常见的流派及其特性_正则表达式_02

 2、 PCRE 流派

目前大部分常用编程语言都是源于 PCRE 标准,这个流派显著特征是有\d、\w、\s 这类字符组简记方式。

虽然 PCRE 流派是与 Perl 正则表达式相兼容的流派,但这种兼容在各种语言和工具中还存在程度上的差别,这包括了直接兼容与间接兼容两种情况。Perl 语言中的正则表达式在不断改进和升级之中,其他语言和工具不可能完全做到实时跟进与更新。

  • 直接兼容,PCRE 流派中与 Perl 正则表达式直接兼容的语言或工具。比如 Perl、PHP  preg、PCRE 库等,一般称之为 Perl 系。
  • 间接兼容,比如 Java 系(包括 Java、Groovy、Scala 等)、Python 系(包括 Python2 和 Python3)、JavaScript 系(包括原生 JavaScript 和扩展库 XRegExp)、.Net 系(包括 C#、VB.Net 等)等。

3、在 Linux 中使用正则

在遵循 POSIX 规范的 UNIX/LINUX 系统上,按照 BRE 标准 实现的有 grep、sed 和 vi/vim 等,而按照 ERE 标准 实现的有 egrep、awk 等。

在 UNIX/LINUX 系统里 PCRE 流派与 POSIX 流派的对比。

正则中常见的流派及其特性_正则表达式_03

其实有一些工具实现同时兼容多种正则标准,比如 grep 和 sed。如果在使用时加上 -E 选项,就是使用 ERE 标准;如果加上 -P 选项,就是使用 PCRE 标准。

使用 ERE 标准
grep -E '[[:digit:]]+' access.log

使用 PCRE 标准
grep -P '\d+' access.log

执行 man grep ,可以看到选项 -G 是指定使用 BRE 标准(默认),-E 是 ERE 标准,-P 是 PCRE 标准。所以,在使用具体工具时,你通过这个方法查一下命令的说明就好了。

正则中常见的流派及其特性_正则表达式_04

标签:PCRE,标准,特性,ERE,正则,POSIX,BRE,流派
From: https://blog.51cto.com/key3feng/7379211

相关文章

  • c++11新特性
    这篇文章基本上涵盖了c++11的所有新特性,并有详细代码介绍其用法,对关键知识点做了深入分析,对重要的知识点我单独写了相关文章并附上了相关链接,我还准备了完整版c++新特性脑图,有需要可以去我的gz号回复“新特性”下载,见文章最后。auto&decltype关于C++11新特性,最先提到的肯定......
  • C++14新特性
    这篇文章介绍下C++14的新特性。 函数返回值类型推导 C++14对函数返回类型推导规则做了优化,先看一段代码: #include<iostream>usingnamespacestd;autofunc(inti){returni;}intmain(){cout<<func(4)<<endl;return0;} 使用C++11编......
  • 讯飞星火认知大模型升级,新特性亮相!
    亲爱的家人们,大家好!我们之前有一篇公众号文章了介绍了讯飞星火认知大模型,今天了讯飞星火认知大模型也迎来一次重要的更新升级!这次升级将为大家带来一系列新特性,让我们一起来看看这些新特性都有哪些吧!星火认知大模型:https://xinghuo.xfyun.cn/图像能力代码能力的提升我们尝试让它用......
  • ES6的新特性有哪些
    1、let和const声明变量的方式,取代了var关键字。2、箭头函数(ArrowFunction),简化了函数的书写方式。3、模板字符串(TemplateString),允许在字符串中使用变量和表达式,而不需要使用字符串连接符号4、解构赋值(DestructuringAssignment),允许从数组和对象中提取值并赋值给变量。......
  • ipv4+ipv6+端口号正则表达式,最极限的各种搭配组合
    Ipv4^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$Ipv6^([\da-fA-F]{1,4}:){6}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^::([\da-fA-F]{1,4}:){0,4}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25......
  • 正则表达式直接取值法
        请使用正则表达式方法提取以下文字中的姓名、性别、年龄、账号、密码、作品和电话号码。要求只提取项目内容,电话号码使用状态不提取。text="姓名:海风,性别:男,年龄:52,账号:12345,密码:6789,作品:<<'双随机'管理系统>>电\\\话:133****5117(常用)" 采用直接......
  • 正则表达式,几种常见的量词
    当处理正则表达式时,通常会遇到以下几种常见的量词:*:匹配前面的表达式零次或多次。例如,a*b可以匹配"b","ab","aab","aaab"等。+:匹配前面的表达式一次或多次。例如,a+b可以匹配"ab","aab","aaab"等,但不能匹配"b"。?:匹配前面的表达式零次或一次。例如,a?b可以匹......
  • 《C++》11新特性--多线程
    thread创建线程,不会阻塞主线程thread成员函数voidthread::join();阻塞线程,当前线程执行完毕才会往下执行boolthread::joinble();线程是否可以连接,返回voidthread::detach();分离主线程和子线程的关联voidprintI(){for(size_ti=0;i<100;i++){std::c......
  • [个人笔记][C#]反射和特性学习笔记
    反射通过Type类型的实例来访问类型的元数据通过obj.GetType()或typeof()获取一个Type类型的实例在Type类型的实例上通过GetProperties(),GetMethods(),GetCustomAttributes()访问类型的各种东西GetType()只能在实例上调用,typeof()给一个类型名就行,它是在编译时求值的验证一个......
  • ingress正则表达式
    如何使用NginxIngress快速实现URL重写奇妙的Linux世界 2023-09-0408:26 发表于重庆 以下文章来源于云原生运维圈 ,作者船长云原生运维圈.专注于云原生运维技术分享,致敬每个爱学习的你!公众号关注 「奇妙的Linux世界」设为「星标」,每天带你玩转Linux!......