正则表达式的分类

文章目录

  • 一、正则表达式引擎
  • 二、正则表达式分类
  • 三、正则表达式比较
  • 四、Linux/OS X 下常用命令与正则表达式的关系

一、正则表达式引擎

正则引擎大体上可分为不同的两类:DFANFA,而 NFA 又基本上可以分为传统型 NFAPOSIX NFA

  1. DFA(Deterministic Finite Automaton) 确定型有穷自动机

  2. NFA(Non-deterministic finite automaton) 非确定型有穷自动机
    (1) Traditional NFA
    (2) POSIX NFA

DFA 引擎因为不需要回溯,所以匹配快速,但不支持捕获组,所以也就不支持反向引用和 $number 这种引用方式,目前使用 DFA 引擎的语言和工具主要有 awkegreplex

POSIX NFA 主要指符合 POSIX 标准的 NFA 引擎,它的特点主要是提供 longest-leftmost 匹配,也就是在找到最左侧最长匹配之前,它将继续回溯。同 DFA 一样,非贪婪模式或者说忽略优先量词对于 POSIX NFA 同样是没有意义的。

目前 JavaScript,Java,Php,Python,C# 等语言均实现了 NFA 引擎。

大多数语言和工具使用的是传统型的 NFA 引擎,它有一些 DFA 不支持的特性:

  1. 捕获组、反向引用和 $number 引用方式;

  2. 环视(Lookaround),(?<=…)(?<!…)(?=…)(?!…),或者有的有文章叫做预搜索;

  3. 忽略优先量词??*?+?{m,n}?{m,}?,或者有的文章叫做非贪婪模式;

  4. 占有优先量词?+*+++{m,n}+{m,}+,目前仅 JavaPCRE 支持,固化分组 (?>…)

按以上的说法,awk、egrep、lex 使用 DFA 引擎,所以不支持捕获组、反向引用和 $number 引用方式;不支持环视;不支持忽略优先修饰符;不支持占有优先修饰符。我觉得有问题,改天再验证吧!!

二、正则表达式分类

在 Linux 和 OS X 下,常见的正则表达式,至少有以下三种:

  1. 基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx 简称 BREs
  2. 扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称 EREs
  3. Perl 的正则表达式(Perl Regular Expression 又叫 Perl RegEx 简称 PREs

三、正则表达式比较

字符说明Basic RegExExtended RegExPython RegExPerl RegEx
^匹配行首或者字符串的开始处^^^^
$匹配行尾或者字符串的结尾处$$$$
^$匹配空行^$^$^$^$
\<匹配单词开始处。例如,\<liao,表示匹配以 liao 开头的单词。等价于 \bliao\<\<不支持不支持,但是可以使用 \b 来匹配单词边界
\>匹配单词结尾处\>\>不支持不支持,但是可以使用 \b 来匹配单词边界
>匹配单词结尾处,这种元字符的含义有问题>>不支持不支持,但是可以使用 \b 来匹配单词边界
?匹配前面的子表达式 0 次或者 1 次;匹配前面的子表达式 0 个或 1 个;匹配 0 个或 1 个前面的子表达式;匹配 0 个或 1个前面的子表达式所代指的字符串;匹配 0 个或 1 个前面的子表达式所匹配到的字符串不支持,需要转义???
\?匹配前面的子表达式 0 次或者 1 次,这种元字符的含义有问题\?不支持不支持不支持
?问号跟在任何一个量词后面,则变成非贪婪匹配模式。不支持不支持不支持不支持
.匹配除了换行符以外的任意一个字符(awk 指令中的句点 . 可以匹配换行符 \n..(如果要匹配包含换行符在内的任意单个字符,可以使用 [\s\S]..(如果要匹配包含 \n 在内的任意一个字符,可以使用 [.\n]
*匹配前面的子表达式任意次;匹配前面的子表达式任意个;匹配任意次前面的子表达式****
+匹配前面的子表达式 1 次或者多次需要转义+++
{n}n 是一个非负整数,表示匹配前面的子表达式 n需要转义,\{n\}{n}{n}{n}
x|y匹配 x 或者 y需要转义,x\|yx|yx|yx|y
\d匹配从 0 到 9 中的任意一个数字字符不支持不支持\d\d
\D匹配非数字的任意一个字符不支持不支持\D\D
\S匹配除了空白字符以外的任意一个字符不支持不支持\S\S
\s匹配任意一个空白字符,等价于 [\f\n\r\t\v]不支持不支持\s\s
\W匹配除了英文字母、数字、下划线以外的任意一个字符\W\W\W\W
\w匹配英文字母、数字、下划线中的任意一个字符\w\w\w\w
\B匹配非单词边界,例如,er\B 可以匹配 here 中的 er,但是不能匹配 hier 中的 er\B\B\B\B
\b匹配单词边界\b\b\b\b
\f匹配一个换页符。等价于 \x0c\cL不支持不支持\f\f
\n匹配一个换行符。等价于 \x0a\cJ不支持不支持\n\n
\r匹配一个回车符。等价于 \x0d\cM不支持不支持\r\r
\t匹配一个横向制表符。等价于 \x09\cI不支持不支持\t\t
\v匹配一个垂直制表符。等价于 \x0b\cK不支持不支持\v\v
\cx匹配由 x 指明的控制字符。例如,\cM 匹配一个 Control-M 或回车符,x 的值必须为一个英文字母,否则 c 被视为一个普通字符不支持不支持\cx
\xn匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,\x41 匹配 A 。正则表达式中可以使用 ASCII 编码。不支持不支持支持
\num其中 num 为一个正整数,表示对所获取的匹配的引用不支持\num\num

注意:

  1. js 中支持的是 EREs。
  2. 当使用 BREs ( 基本正则表达式 ) 时,必须在下列这些符号 ?,+,|,{,},(,) 前加上转义字符。

四、Linux/OS X 下常用命令与正则表达式的关系

我曾经尝试在 grep 和 sed 命令中书写正则表达式,经常发现某些元字符不能直接使用,有些需要转义,有些又不需要转义,下面就梳理了不同的命令所支持的正则表达式种类。

命令正则表达式特定
grep
支持 BREs、EREs、PREs 正则表达式。
1. 指令后不跟任何参数, 则表示要使用 “BREs”;
2. grep 指令后跟 ”-E” 参数, 则表示要使用 “EREs”;
3. grep 指令后跟 “-P” 参数, 则表示要使用 “PREs”。
egrep
支持 EREs、PREs 正则表达式。
1. egrep 指令后不跟任何参数, 则表示要使用 “EREs”;
2. egrep 指令后跟 “-P” 参数, 则表示要使用 “PREs”。
sed
支持 BREs、EREs。
1. sed 指令默认是使用 “BREs”;
2. sed 指令后跟 “-r” 参数 , 则表示要使用“EREs”。
awk
支持 EREs,并且默认使用 “EREs”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spock测试_使用Spock测试您的代码

spock测试Spock是针对Java和Groovy应用程序的测试和规范框架。 Spock是&#xff1a; 极富表现力 简化测试的“给定/何时/然后” 语法 与大多数IDE和CI服务器兼容。 听起来不错&#xff1f; 通过快速访问Spock Web控制台&#xff0c;您可以非常快速地开始使用Spock。 当您有…

深度学习pytorch--多层感知机(一)

多层感知机隐藏层激活函数ReLU函数sigmoid函数tanh函数多层感知机小结我们已经介绍了包括线性回归和softmax回归在内的单层神经网络。然而深度学习主要关注多层模型。在本节中&#xff0c;我们将以多层感知机&#xff08;multilayer perceptron&#xff0c;MLP&#xff09;为例…

太阳能板如何串联_光伏板清洁专用的清洁毛刷

光伏发电是利用半导体界面的光生伏特效应将光能直接转变为电能的一种技术。主要由太阳电池板&#xff08;组件&#xff09;、控制器和逆变器三大部分组成。主要部件由电子元器件构成。太阳能电池经过串联后进行封装保护可形成大面积的太阳电池组件&#xff0c;再配合上功率控制…

java 异步等待_Java中的异步等待

java 异步等待编写异步代码很困难。 试图了解异步代码应该做什么的难度更大。 承诺是尝试描述延迟执行流程的一种常见方式&#xff1a;首先做一件事&#xff0c;然后再做另一件事&#xff0c;以防万一出错时再做其他事情。 在许多语言中&#xff0c;承诺已成为协调异步行为的实…

cass生成曲线要素_干货在线 | CASS入门指南——道路断面计算土方

CASS操作指南——道路断面计算土方法小伙伴们赶紧学起来&#xff01;道路类的土方工程&#xff0c;主要用CASS的断面法土方计算之道路断面来计算。整个计算过程主要分为以下四步&#xff1a;菜单截图第一步&#xff1a;绘制道路中心线道路的中心线&#xff0c;一般由直线段和缓…

正则表达式的捕获性分组/反向引用

文章目录分组捕获性分组和反向引用分组 正则的分组主要通过小括号来实现&#xff0c;括号包裹的子表达式作为一个分组&#xff0c;括号后可以紧跟限定词表示重复次数。如下&#xff0c;小括号内包裹的 abc 便是一个分组: // (abc) 表示匹配一个或多个"abc"&#xf…

深度学习pytorch--多层感知机(二)

多层感知机的从零开始实现获取和读取数据定义模型参数定义激活函数定义模型定义损失函数训练模型小结我们已经从上一节里了解了多层感知机的原理。下面&#xff0c;我们一起来动手实现一个多层感知机。首先导入实现所需的包或模块。 import torch import numpy as np获取和读取…

jwt同一会话_在会话中使用JWT

jwt同一会话这个话题已经在黑客新闻&#xff0c;reddit和博客上讨论了很多次。 共识是–请勿使用JWT&#xff08;用于用户会话&#xff09;。 而且我在很大程度上同意对JWT的典型论点 &#xff0c; 典型的“但我可以使其工作……”的解释以及JWT标准的缺陷的批评 。 。 我不会…

表必须要有主键吗_玄关隔断什么材质好?玄关隔断必须要做吗?

为了避免一到门口就能够看到全部室内的东西&#xff0c;为了更好的保护家居的隐私&#xff0c;目前有很多人都会在玄关的位置加一个隔断&#xff0c;而玄关隔断什么材质好?在做玄关隔断的时候&#xff0c;有些人觉得做了隔断会太浪费空间了&#xff0c;而玄关隔断必须要做吗?…

深度学习pytorch--多层感知机(三)

使用pytorch框架实现多层感知机和实现softmax回归唯一的不同在于我们多加了一个全连接层作为隐藏层。它的隐藏单元个数为256&#xff0c;并使用ReLU函数作为激活函数。#模型的核心代码为:nn.Linear(num_inputs, num_hiddens),nn.ReLU(),nn.Linear(num_hiddens, num_outputs),

mysql 日期索引的使用_日期使用

mysql 日期索引的使用时区糟透了。 特别是夏令时。 我不介意像与此行为相关的编程错误那样&#xff0c;不停移动时钟或失去一个小时的睡眠。 更糟糕的是Java的旧日期/时间API。 Java社区通过JSR 310公开承认了这一点&#xff0c;该JSR 310代替了Java Date&#xff06;Time API…

axure元件库 文件上传_手把手教你打造一套属于产品经理自己的元件库

之前有篇文章聊完了如何打造一套属于自己的原型图设计规范&#xff0c;今天咱们来聊聊如何打造一套属于自己的元件库。毕竟&#xff0c;每个追求效率的PM&#xff0c;总会拥有一个专属自己的Axure元件库&#xff0c;并不断打磨优化。今天就教大家一步一步创建属于自己的Axure元…

KMP算法笔记

1.KMP算法本质上就是对朴素匹配算法(BF)的一个优化&#xff0c;减少朴素匹配算法中不必要匹配的次数&#xff0c;核心代码和朴素匹配算法差不多&#xff0c;BF是移动字串逐个字符匹配&#xff0c;每次模式串(子串)匹配只移动一个字符单位&#xff0c;而KMP算法是每次模式串匹配…

正则表达式的非捕获性分组

非捕获性分组&#xff0c;通常由一对括号加上 ?: 加上子表达式组成&#xff0c;非捕获性分组不会创建反向引用&#xff0c;就好像没有括号一样。如下: var color "#808080"; var output color.replace(/#(?:\d)/,"$1""~~"); console.log(Re…

Spring Security并发会话控制示例教程–如何限制Java JEE Web应用程序中的用户会话数...

如果您不知道&#xff0c; Spring安全性可能会限制用户可以拥有的会话数。 如果要开发Web应用程序&#xff0c;尤其是Java JEE中的安全Web应用程序 &#xff0c;则必须提出与在线银行门户相似的要求&#xff0c;例如&#xff0c; 每个用户一次只能有一个会话&#xff0c;或者每…

prometheus命令_Prometheus 入门

学习安装 Prometheus 监控和警报系统并编写它的查询。-- Michael Zamot(作者)Prometheus 是一个开源的监控和警报系统&#xff0c;它直接从目标主机上运行的代理程序中抓取指标&#xff0c;并将收集的样本集中存储在其服务器上。也可以使用像 collectd_exporter 这样的插件推送…

正则表达式的命名分组

语法格式&#xff1a;(?<name>…) 命名分组也是捕获性分组&#xff0c;它将匹配的字符串捕获到一个组名称或编号名称中&#xff0c;在获得匹配结果后&#xff0c;可通过分组名进行获取。 如下是一个python的命名分组的例子&#xff1a; import re data "#80808…

python--字符/文本编码解码笔记

字符/文本编码解码笔记1.字符问题编码和解码2.字节概要3.基本的编解码器编码类型史字符编码ASCII码GB2312以及其他编码UNICODE标准编码UTF-8编码4.了解编解码问题处理UnicodeEncoderError解决方法:处理UnicodeDecodeError解决方法5.修改源代码编码6.查看文件编码方式终端查看文…

neo4j cypher_Neo4j:Cypher – Neo.ClientError.Statement.TypeError:不知道如何添加Double和String...

neo4j cypher最近&#xff0c;我将支持Neo4j的应用程序从Neo4j 3.2升级到Neo4j 3.3&#xff0c;发现围绕类型强制的行为发生了有趣的变化&#xff0c;导致我的应用程序抛出了很多错误。 在Neo4j 3.2和更早版本中&#xff0c;如果将String添加到Double&#xff0c;它将把Double…

easyui数据表格显示复选框_【Excel技巧】使用控件一键切换实现单位元和万元随意显示...

工欲善其事&#xff0c;必先利其器。职场上亦是如此。Excel报表想要做得完美&#xff0c;首先肯定Excel要精通。做一份Excel报表&#xff0c;如果涉及到金额&#xff0c;当金额比较大&#xff0c;单位到底是用元还是万元&#xff0c;经常是大家纠结的一个问题。我们今天就来介绍…