正则表达式如何在幕后工作(在 CPU 级别)?

2024-01-11

解释器和编译器是否以逐个字符和从左到右的方式比较(并最终匹配)两个字符串是否可能匹配?或者是否有一个底层二进制值(例如,位模式)分配给比较函数中的每个字符串?或者它是否取决于以某种方式(ASCII 或 UTF-32)编码的字符串,或者解释器、编译器、数据库引擎或编程语言?

重新设计数据存储(数据文件或数据库)是一项相当大的工作。 stackoverflow 上类似问题的答案并未明确描述编码问题(是评估位模式还是实际的字母字符)。这个问题的答案对于优化工作可能很重要。

我不想知道如何实现正则表达式(例如,编写我自己的)。我想知道出于教育目的以最佳方式使用现有正则表达式的好处(例如,当需要设计要存储为子字符串组合的数据时,我是否应该注意从左到右的评估)。类似的 StackOverflow 问题answer https://swtch.com/~rsc/regexp/regexp1.html(这是一个具有不受信任的证书的链接,可以查看它)重点关注有限自动机(如何比较字符串的理论)。该答案强调了它的工作原理以及比较字符串的计算复杂性。它确实意味着存在从左到右的角色评估。我认为无论如何这都不是决定性的。这篇文章主要针对 Perl 和与语言无关的 Thomson 非确定性有限自动机算法。我想确切地了解这三种技术组合:1)使用 ASCII 数据文件的 Java 本机函数,2)MySQL(表数据和 SELECT 语句),以及 3)使用 Python 本机函数和 UTF-32 数据文件。

我的问题和方法与旧帖子不同,因为我并不是试图开发一个用于执行正则表达式的解析器。我正在尝试为未来的开发构建数据。我想知道如何以最佳方式利用现有的正则表达式工具。我相信 stackoverflow 是正确的论坛,因为它是正则表达式的核心,并且这个问题以其原始且不那么冗长的形式已被投票通过。

我想知道在CPU级别,位模式是字符串中字符的表示形式吗?是否存在与参与其中锚定一个字符串的比较的字符串的每个字符相对应的位模式的短期索引?我认为技术(例如数据库、编程语言和/或数据编码)会有所不同。


正则表达式引擎有两大系列,称为NFA and DFA(我使用的是 Jeffrey Friedl 书中的术语):

  • 不确定性有限自动机
  • 确定性有限自动机

NFA 实施将roughly按以下方式工作:

  • 保留一个指向a的指针当前偏移量 in the 输入字符串
  • 保留一个指向当前位置 in the pattern(被解释为图形或树)。

然后使用该模式作为recipe如何在输入字符串中前进。如果模式说a例如,如果当前输入偏移指向一个a字符,那么该字符将是consumed并且两个指针都会前进到下一个位置。如果字符不匹配,则会回溯(输入指针将转到先前的有效位置,并且模式指针将在输入位置设置为不同的可能替代位置)。

重点是识别是由模式驱动的.

(上面的解释是very粗糙,因为它不包括优化等 - 而且现代模式无论如何都不能用正式的自动机来实现)

DFA 实现的工作原理相反:

还有one输入指针,但有multiple模式指针。输入模式将逐个字符前进,并且模式指针将跟踪给定输入的模式中的有效状态。

The 识别由输入驱动.

这两种方法具有非常不同的属性:

  • NFA引擎可以提供更多的功能,但它们的运行时间取决于输入和模式本身的组合
  • DFA引擎提供的功能较少,但其复杂性O(n), where n是输入字符串的长度。

一些正则表达式引擎(例如PCRE)可以实现这两种识别方法。我建议您阅读PCRE 文档 http://www.pcre.org/current/doc/html/pcre2matching.html关于两种匹配算法,用更专业的术语解释了差异。

至于actual实现,它很大程度上取决于正则表达式引擎本身。 PCRE 有几个:

  • 基于树遍历方法的NFA算法
  • 基于 JIT 编译的上述优化版本(每个支持的指令集一个版本)
  • DFA 实施

因此,您实际上可以看到,仅针对 NFA 就有几种可能的方法。其他引擎具有不同的实现,允许不同的功能集。例如,.NET 的正则表达式可以从左到右或从右到左匹配,因此可以轻松提供可变长度的lookbehind,而 PCRE 的lookbehind 是通过将输入指针临时向左移动lookbehind 的预期输入来实现的长度,并从此偏移量执行从左到右的匹配。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正则表达式如何在幕后工作(在 CPU 级别)? 的相关文章

  • SQL 选择与带有通配符的 URL 匹配的行

    我在数据库中有一个表 其中一列包含一个 URL 例如http example com users http example com users 轮廓 我得到了一个 URL 例如http example com users 234 profi
  • 在 Java/GWT 中解析用户时间输入

    解析用户在 GWT 中的文本字段中键入的时间的最佳方法是什么 默认时间格式要求用户完全按照区域设置指定的时间格式输入时间 我想要更加灵活 因为用户可以通过多种不同的方式输入时间 例如 8 8p 8pm 8 15pm 13 15 1315 1
  • 基于Java模式分割字符串

    您好 我有以下模式的日志文件 2014 03 06 03 21 45 432 ERROR mfs pool 3 thread 19 dispatcher StatusNotification Error processing notific
  • 如何在Powershell控制台中分配多行字符串

    当我在 powershell 控制台中输入此内容时 test Test Test 并且输入多次 它会一直打印 gt gt 所以我永远无法完成命令 该怎么办 应该是行中的第一件事 或者它被认为只是字符串的一部分 test Test Test
  • 如何防止用户生成的 Sql 查询上的 Sql 注入

    我有一个项目 私有的 ASP net 网站 受 https 密码保护 其中要求之一是用户能够输入直接查询数据库的 Sql 查询 我需要能够允许这些查询 同时防止它们对数据库本身造成损坏 以及访问或更新它们不应该访问 更新的数据 我制定了以下
  • R:变换不规则时间字符串

    我有两个不同的时间序列 来自不同的数据帧 具有不同的不规则格式 但问题是相同的 我只想提取小时 分钟 秒和毫秒 时代系列看起来像这样 ts1 08 27 23 445 08 27 24 280 08 27 25 115 I tried st
  • 句子中模糊的电子邮件地址

    我正在输出日志消息 需要隐藏其中的电子邮件地址 日志消息可能如下所示 A lead was saved for email protected cdn cgi l email protection Date 11th December 20
  • laravel 正则表达式验证不起作用

    我刚刚开始使用 laravel 正在努力验证我的表单之一中的文本区域 文本区域用于用户简介 因此我只想允许使用字母 数字 空格和以下字符 这就是我所拥有的 validator Validator make Input all array b
  • 由表达式文字生成的正则表达式是否共享单个实例?

    以下代码片段 来自 Crockford 的Javascript 好的部分 演示了由正则表达式文字创建的 RegExp 对象共享单个实例 function make a matcher return a gi var x make a mat
  • 如何在正则表达式中编写可选单词?

    我想编写一个识别以下模式的 java 正则表达式 abc def the ghi and abc def ghi 我试过这个 abc def the ghi 但是 它没有识别第二种模式 我哪里出错了 abc def the ghi 删除多余
  • 使用正则表达式验证电子邮件的最大长度

    我找到了用于电子邮件验证的正则表达式 a z0 9 a z0 9 a z0 9 a z0 9 a z 2 4 我希望电子邮件的最大长度为 20 个字符 因此我将其更改为 a z0 9 a z0 9 a z0 9 a z0 9 a z 2 4
  • 测试 xmm/ymm 寄存器是否为零的更快方法?

    It s fortunate that PTEST does not affect the carry flag but only sets the rather awkward ZF also affects both CF and ZF
  • 将 Regex 对象分配给 html 输入模式

    我需要以编程方式将正则表达式对象分配给输入元素模式属性 以下是我当前的实现 var regex d 5 element attr pattern regex toString slice 1 1 有没有更好的方法来做到这一点而不需要字符串操
  • 如何为所有语言创建字母数字正则表达式?

    我今天遇到了这个问题 此正则表达式仅匹配英语 a zA Z0 9 如果我需要支持这个世界上的任何语言 我应该编写什么正则表达式 如果您使用字符类简写和 Unicode 识别正则表达式引擎 您就可以做到这一点 这 wclass 匹配 单词字符
  • 在 String 值之后打印 int 值

    我有以下示例代码 int pay 80 int bonus 65 System out println pay bonus bonus pay 有人可以向我解释一下为什么我得到以下输出 145 6580 您的代码正在从左到右解释表达式 pa
  • Python从int到string的快速转换

    我正在用 python 求解大量阶乘 并发现当我完成计算阶乘时 需要相同的时间才能转换为字符串以保存到文件中 我试图找到一种将 int 转换为字符串的快速方法 我将举一个计算和 int 转换时间的例子 我正在使用通用的 a str a 但感
  • 什么正则表达式永远无法匹配?

    Merged https meta stackexchange com questions 158066 what is a merged question with 永远不会与任何内容匹配的正则表达式 questions 1723182
  • 假装 .NET 字符串是值类型

    在 NET 中 字符串是不可变的 并且是引用类型变量 这通常会让新的 NET 开发人员感到惊讶 因为他们的行为可能会将它们误认为是值类型对象 然而 除了使用实践StringBuilder对于长连接 尤其是 在循环中 在实践中是否有任何理由需
  • 检查字符串是否编码为 UTF-8

    function seems utf8 str length strlen str for i 0 i lt length i c ord str i if c lt 0x80 n 0 0bbbbbbb elseif c 0xE0 0xC0
  • 使用正则表达式查找除一个字符串之外的所有字符串[重复]

    这个问题在这里已经有答案了 我想匹配除字符串之外的所有字符串 ABC 例子 A gt Match F gt Match AABC gt Match ABCC gt Match CBA gt Match ABC gt No match 我尝试

随机推荐