正则表达式引擎是否会跳过比模式短的字符串?

2023-12-11

我想循环一组字符串。在每个字符串上,我想循环遍历一组正则表达式,以确定哪些表达式与我所在的字符串匹配。但是,如果字符串长度短于模式字符串的最大可能长度,我希望正则表达式引擎跳过它。

例如,假设我停在字符串“abc”上 并用这个正则表达式测试它。

(?i)[A-Z]{3}

它匹配。然后我要测试的下一个表达式就像

(?i)[A-Z]+(?=123)

即使第二种情况永远不会匹配,引擎是否仍会从头开始检查字符串?

如果是这种情况,有没有办法让它跳过不满足最小长度要求的字符串?


当您了解实现细节并且源代码可用时,最好的判断方法就是简单地查看它。 :)

简短的回答是:不完全是.

.NET 正则表达式实现中实现的优化是博耶-摩尔字符串搜索作为匹配的第一阶段如果可能。看看源代码对于血淋淋的细节。

从代码本身来看:

// The RegexBoyerMoore object precomputes the Boyer-Moore
// tables for fast string scanning. These tables allow
// you to scan for the first occurance of a string within
// a large body of text without examining every character.
// The performance of the heuristic depends on the actual
// string and the text being searched, but usually, the longer
// the string that is being searched for, the fewer characters
// need to be examined.

这需要一个锚定prefix,其搜索方式为这个功能,其评论说:

/*
 * This is the one of the only two functions that should be called from outside.
 * It takes a RegexTree and computes the set of chars that can start it.
 */

匹配算法包含返回一个no match如果输入字符串短于计算的前缀,则立即结果。

请注意,它也在寻找anchors当然,并针对这些进行优化。

I did not find a minimum length optimization in the code, but I admit I didn't read it thoroughly (gotta do that one day). But I know other regex implementations which do this kind of optimization (PCRE comes to mind). Anyway, the .NET implementation has its own way of optimizing things, you should rely on that.

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

正则表达式引擎是否会跳过比模式短的字符串? 的相关文章

  • 至少 6 个字符正则表达式 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在寻找至少检查 6 个字符的正则
  • C# .Net Serial DataReceived 事件响应对于高速数据来说太慢

    我已经设置了一个 SerialDataReceivedEventHandler 并在 VS2008 Express 中使用基于表单的程序 我的串口设置如下 115200 8N1 Dtr 和 Rts 已启用 接收字节阈值 1 我有一个通过蓝牙
  • 字典 API(词汇)[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人知道一个好的 NET 字典 API 吗 我对含义不感兴趣 而是我需要能够以多种不同的方式查询单词 返
  • 并行应用程序的可变与不可变[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在我正在编写的应用程序中 我需要编写大量基本类型 这些类型很可能是不可变的 但我想知道并行应用程序中可变类型与不可变类型的比较如何 您可以对可变
  • 正则表达式不等于字符串

    我用正则表达式用头撞墙 我正在尝试定义一个表达式 该表达式完全排除此文本 System 不区分大小写 但可以包含 系统 这个词提供的不仅仅是这个 例子 系统 无效 系统 无效 系统 无效 系统 无效 asd 系统 有效 asd 系统 asd
  • 在 DataGridView 中隐藏行非常慢

    我在 Winforms 应用程序中有一个 DataGridView 大约有 1000 行 未绑定 和 50 列 隐藏一列需要整整 2 秒 当我想隐藏大约一半的行时 这就成为一个问题 private void ShowRows string
  • Java有没有类似微软CHESS的工具?

    是否有类似于 Microsoft 的现有 Java 工具CHESS http research microsoft com chess 或者 CHESS 源代码是否开放 以便我可以尝试将其转换为 Java 谷歌的织线工 http code
  • 如何使用正则表达式匹配模式的最后一次出现

    我有一个像这样的字符串 token1 token2 我要匹配 token2 使用正则表达式 它应该匹配的其他可能的情况是 token1 应该匹配 最后一个 token1 应该匹配 最后一个 token1 token2应该匹配 token2
  • 找不到 Microsoft.Office.Interop Visual Studio

    我正在开发一个使用 C 发送电子邮件的应用程序 该应用程序将能够使用邮件模板等 问题是我无法找到任何 Office Interop 引用 这意味着我无法使用 Outlook 我的计算机上安装了 Office 但我也尝试从此链接安装 PIAh
  • 在 .Net 托管的 IronPython 脚本中设置和获取变量

    我正在尝试使用 Net 控制台应用程序中托管的 IronPython 来构建验证规则引擎的原型 我已经将脚本精简到我认为的基础内容 var engine Python CreateEngine engine Execute from Sys
  • 正则表达式匹配整个单词[重复]

    这个问题在这里已经有答案了 我在 stackoverflow 上看到了很多关于使用正则表达式进行全词匹配的例子 我有以下情况 我想用 www xyz com 替换 www abc com string RetVal I am going t
  • Java中字符串中特殊字符的替换

    Java中如何替换字符串 E g String a adf sdf 如何替换和避免特殊字符 您可以删除除此之外的所有字符可打印的 ASCII 范围 http en wikipedia org wiki ASCII ASCII printab
  • 如何正确转义mysql?

    我刚刚发现如果我写 select from tbl where name like foo 然后添加 foo 作为参数及其值 a 用户数据 它不会正确转义 我勒个去 它想要 a 即使我使用参数 我还是忍不住觉得我对 sql 注入持开放态度
  • 为什么当要求修剪“PRN.NUL”时,TrimStart 会更多地修剪字符?

    这是代码 namespace TrimTest class Program static void Main string args string ToTrim PRN NUL Console WriteLine ToTrim string
  • .NET“默认行终止符”?

    有什么方法可以弄清楚 NET 使用什么作为其 默认行终止符 例如 StringBuilder AppendLine String 的文档表示 附加指定字符串的副本 后跟默认行终止符 NET 中的几个与文本相关的类引用相同的概念 有什么方法可
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 枚举扩展方法

    在vs2008中 是否可以编写适用于任何枚举的扩展方法 我知道您可以针对特定枚举编写扩展方法 但我希望能够使用单个扩展方法对每个枚举进行处理 这可能吗 是的 只需针对基础进行编码Enum类型 例如 public static void So
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 如何仅删除单括号并保留配对的括号

    你好 我亲爱的老师 R 用户朋友们 我最近开始认真学习正则表达式 最近我遇到了一种情况 我们只想保留配对括号 并省略未配对的 这是我的样本数据 structure list t1 c Book Pg 1 Website Online Jou

随机推荐

  • Flask 网站 -- 500 内部服务器错误

    我一生都无法弄清楚为什么我试图启动的这个烧瓶应用程序不起作用 我在 5 美元的 Digital Ocean Droplet 上运行它 这是 希望 您需要了解的所有信息 目录布局 包含在 var www FlaskApp FlaskApp i
  • 在悬停事件上设置 CSS 渐变背景动画

    我有一些菜单项 它们在悬停时使用背景渐变进行样式设置 使用以下样式 sidebar ul li a hover background image linear gradient bottom rgb 68 68 68 5 rgb 51 51
  • 外线 Seaborn 小提琴图/箱线图

    I am using the violinplot function from the Seaborn library Sometimes the outer lines are visualized and sometimes they
  • 仅当请求来自另一个特定网站时才允许登录网站

    我有一个 PHP MySQL 网站 网站 1 它的登录系统只要求输入 PIN 码 只是一个长数字字符串 用户有两种方式使用此代码登录 转到网站 1 登录页面并在典型的登录表单中输入代码 单击网站 2 中的链接 该链接带有 PIN 码作为 G
  • 使用与 Google 表格中的前一个单元格相同的值填充空单元格(数组公式)

    我有一个可以在此示例中看到的数据列表 https docs google com spreadsheets d 1bRiupsmjfDRE9AgcM 5KJKAyxYKpQiMuyAGSoGaZYN0 edit usp sharing 范围
  • 加载共享库时出错:Java 中的 libjli.so

    我安装了 ElementaryOS 我正在终端中运行Processing IDE 方法是运行 processing in the processing 3 3 4目录 我收到此错误 java error while loading shar
  • Django Createview 外键字段的默认值

    我有两个相关的班级 表 学校和学生 外键 当我创建一个新学生时 我希望它自动填充学校字段 这是学校班级 表 中名称字段的外键 因为它已经链接到学校 我尝试过 def get initial self 但没有运气 它给了我错误 如果有人能指出
  • 如何使用 DOMDocument 方法更改节点的根?

    如何只更改 DOM 节点的根标签名称 在 DOM Document 模型中我们无法更改属性documentElement of a DOMElement对象 所以 我们需要 重建 节点 但是如何 重建 childNodes财产 注意 我可以
  • 使用python查找图像存在的docx文件

    我如何找到文档文件中存在的图像 python 中有没有相应的模块 我搜索过但没有用 这就是我们如何从word文件中读取内容 下面的代码没有提供有关文件中存在的图像的信息 from docx import Document documnet
  • 在 debian 中安装 Node js 时出错

    我尝试安装在debian nodejs 我正在按照以下步骤操作如何在 ubuntu 上安装 Node js但当我跑步时sudo bash nodesource setup sh下面的错误向我显示 有人帮我解决吗 W The reposito
  • React Native - 应用程序如何确定设备上未找到的打包器 IP 地址

    我有一个 React Native 应用程序 如果我在 iOS 模拟器上运行它 它可以工作并且可以连接到在 localhost 8081 上运行的正在运行的打包程序 但是如果我尝试在实际的 iOS 设备上运行该应用程序 它会失败 因为它无法
  • 子集数据帧中意外输出的原因 - R

    我有数据框 a 它有一个名为 VAL 的变量 我想统计VAL值为23或24的元素 我使用了两个工作正常的代码 nrow subset a VAL 23 VAL 24 nrow subset a VAL in c 23 24 但是 我尝试了其
  • Plotly Scattermapbox:有没有办法在标记上方和下方包含一些文本?

    在 Plotly 中 使用 Scattermapbox 有没有办法在标记上方和下方显示一些文本 目前 仅当我将鼠标悬停在标记上时才会显示文本 并且该图仅显示我想要显示的文本的一部分 我的输入数据框df area如下 我想显示两个中包含的文本
  • Picasa api 是否允许 CORS Post?

    Picasa api 允许跨域 GET 请求 但是当我尝试发布图像 评论时 出现以下错误 XMLHttpRequest 无法加载https picasaweb google com data feed api user default al
  • 如何使用 Python 逻辑检查回文

    我正在尝试用 Python 检查回文 我的代码非常for 循环密集 在我看来 人们从 C 转向 Python 时犯的最大错误是尝试使用 Python 实现 C 逻辑 这使得事情运行缓慢 而且没有充分利用该语言 我看到this网站 搜索 C
  • 如何跳过数组循环中的第一个键?

    我有以下代码 if POST submit Next foreach POST info as key gt value echo value 如何让 foreach 函数从数组中的第二个键开始 对于相当小的数组 使用数组切片创建第二个 f
  • 为什么自调用不适用于 Spring 代理(例如使用 AOP)?

    请解释一下 为什么对代理的自调用在目标上执行而不是在代理上执行 如果这是故意的 那为什么呢 如果通过子类化创建代理 则可以在每个方法调用之前执行一些代码 甚至在自调用时也是如此 我尝试过 并且我有自我调用代理 public class Du
  • 如何使用标志禁用 Crashlytics iOS 库?

    我正在使用最新的 iOS Crashlytics 库 我希望使用单个标志禁用 crashlytics 我怎样才能做到这一点 PS 我没有按照新的 SDK 集成指南使用设置 API 密钥方法 使用 MAC 应用程序集成 您是否试图阻止 Cra
  • 在哪里可以找到 Facebook cookie?

    我对此有点陌生 所以请耐心等待 我已经通过 Javascript SDK 安装了 使用 Facebook 登录 按钮 效果很好 我还设置了 PHP 代码 facebook php 我可以通过 javascript 成功登录 Facebook
  • 正则表达式引擎是否会跳过比模式短的字符串?

    我想循环一组字符串 在每个字符串上 我想循环遍历一组正则表达式 以确定哪些表达式与我所在的字符串匹配 但是 如果字符串长度短于模式字符串的最大可能长度 我希望正则表达式引擎跳过它 例如 假设我停在字符串 abc 上 并用这个正则表达式测试它