查找与所有给定字符串匹配的最简单的正则表达式

2023-11-21

是否有一种算法可以从一组字符串生成正则表达式(可能仅限于简化语法),以便对与正则表达式匹配的所有可能字符串进行求值,从而重现初始字符串集?

为具有非常“复杂”语法(包括任意重复、断言等)的正则表达式语法找到这样一种算法可能是不现实的,所以让我们从一个简化的算法开始,它只允许OR子串数:

foo(a|b|cd)bar应该匹配fooabar, foobbar and foocdbar.

Examples

给定一组字符串h_q1_a, h_q1_b, h_q1_c, h_p2_a, h_p2_b, h_p2_c,算法的期望输出是h_(q1|p2)_(a|b|c).

给定一组字符串h_q1_a, h_q1_b, h_p2_a,算法的期望输出是h_(q1_(a|b)|p2_a). 注意h_(q1|p2)_(a|b) would not 是正确的,因为它扩展到 4 个字符串,包括h_p2_b,这不在原始字符串集中。

Use case

我有一长串标签,它们都是通过将子字符串放在一起生成的。我不想打印大量的字符串列表,而是希望有一个紧凑的输出来指示列表中的标签。由于完整列表是通过编程方式生成的(使用有限的前缀和后缀集),我预计紧凑符号(可能)比初始列表短得多。

((简化的)正则表达式应该尽可能短,尽管我对实用解决方案比最佳解决方案更感兴趣。简单的答案当然是连接所有字符串,例如 A|B|C|D|...然而,这并没有帮助。)


如果您想要找到一组字符串的最小有限状态机 (FSM),那么这个问题有一个直接的解决方案。由于生成的 FSM 不能有循环(否则它将匹配无限数量的字符串),因此应该很容易仅使用连接和析取来转换为正则表达式(|) 运算符。尽管这可能不是最短的正则表达式,但如果您使用的正则表达式库编译为最小化的 DFA,它将生成最小的已编译正则表达式。 (或者,您可以直接将 DFA 与 Ragel 等库一起使用。)

如果您可以使用标准 FSM 算法,则过程很简单:

  1. 只需将每个字符串添加为状态序列,每个序列都从起始状态开始,即可创建非确定性有限状态自动机 (NFA)。清楚地O(N)字符串的总大小,因为原始字符串中的每个字符都恰好有一个 NFA 状态。

  2. 从 NFA 构造确定性有限状态自动机 (DFA)。 NFA 是一棵树,甚至不是 DAG,它应该避免标准算法的指数最坏情况。实际上,您只是在这里构建了一个前缀树,您可以跳过步骤 1 并直接构建前缀树,将其直接转换为 DFA。前缀树的节点数不能多于原始字符数(如果所有字符串都以不同字符开头,则可以具有相同数量的节点),因此其输出为O(N)尺寸,但我没有证据表明它也是O(N)及时。

  3. 最小化 DFA。

DFA 最小化是一个经过充分研究的问题。这霍普克罗夫特算法是最坏的情况O(NS log N)算法,其中N是 DFA 中的状态数量,S是字母表的大小。通常情况下,S将被视为常数;无论如何,Hopcroft 算法的预期时间要好得多。

对于非循环 DFA,有线性时间算法;最常被引用的是 Dominique Revuz,我找到了对其的粗略描述这里是英语;原来的论文似乎是付费的,但是Revuz 的论文(法文)可用。

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

查找与所有给定字符串匹配的最简单的正则表达式 的相关文章

  • Python 正则表达式中的 \B+ 与 [\B]+ 与 [^\b]+

    我在回答 SO 问题时遇到了一个我不明白的问题 我创建了一个简化的示例来说明该问题 场景 我正在测试两个标记 不是随机的英语单词 在字符串中至少相距一定距离 在这个例子中 我们有一个动物列表 我们要确保在羊和狼之间至少还有其他三种动物 否则
  • 密文窃取算法 - 哪一种是正确的?

    网络上提出了两种算法 在这两种算法中 第一部分是相同的 1 Pad the last partial plaintext block with 0 2 Encrypt the whole padded plaintext using the
  • Java 中查看 ArrayList 是否包含对象的最有效方法

    我有一个 Java 对象的 ArrayList 这些对象有四个字段 我用其中两个字段来将对象视为与另一个对象相等 我正在寻找最有效的方法 给定这两个字段 以查看数组是否包含该对象 问题在于这些类是基于 XSD 对象生成的 因此我无法修改类本
  • 正则表达式 - 将 target="blank" 添加到我的内容中的所有 标记链接

    有人可以帮我在 C net 中创建一个正则表达式来添加target blank to all a 在我的内容中标记链接 如果链接已经设置了目标 则将其替换为 blank 目的是在新窗口中打开我的内容中的所有链接 感谢你的帮助 dotnet岩
  • 屏蔽字符串

    我需要将收到的字符串放入以下格式 在打字稿 javascript中 Eg 12 34 56 789 我知道有string mask以及通过 JQuery 的某种方式 有没有更简单的方法来做到这一点 您可以用所需的数据替换每个模式部分 fun
  • 对 Java 中 *any* 类的所有实例进行全排序

    我不确定以下代码是否能确保 Comparator 的 Javadoc 中给出的所有条件 class TotalOrder
  • 正则表达式:匹配未包含在 [] 中的空格

    例如 对于这个字符串 div img wrapper img title Hello world 我想匹配第一个空格 但不匹配第二个空格 包含在 中 正则表达式是什么 以下表达式将通过使用前瞻断言来完成这项工作 gt 下划线代表空格 该表达
  • 按字符分割字符串

    scala 有一个标准的分割字符串的方法StringOps split 但它的行为有点让我惊讶 演示一下 使用快捷便利功能 def sp str String str split toList 以下表达式全部计算结果为 true sp Li
  • 如何在 Swift 中将文件名与文件扩展名分开?

    给定包中文件的名称 我想将该文件加载到我的 Swift 应用程序中 所以我需要使用这个方法 let soundURL NSBundle mainBundle URLForResource fname withExtension ext 无论
  • 局部变量或实例字段名称与正则表达式“[a-z]+”不匹配

    将 Android studio 升级到2 1 2 当我将旧项目导入其中时 我的代码中充满了警告 警告是 Instance field name doesn t match regex a z Local variable name doe
  • 删除PHP字符串中所有不匹配的字符?

    我有一个文本 我想从中删除所有不属于以下字符的字符 所需字符 0123456789 abcdefghijklmnopqrstuvwxyz n 最后一个是我确实想保留的 n 换行符 要匹配除列出的字符之外的所有字符 请使用反转字符集 http
  • 重定向而不改变url

    我总是不喜欢 htaccess 我正在尝试建立一个所有请求都通过index php 的网站 但我希望URL 类似于www sample com home 该网址实际上会加载 www sample com index php page hom
  • 如何以最低的价格优化购物车?

    我有一个我想买的物品清单 这些商品由不同的商店提供 价格也不同 商店有单独的送货费用 我正在寻找一种最佳的购物策略 以及支持它的java库 以最低的总价购买所有商品 Example 商品 1 在 Shop1 的售价为 100 美元 在 Sh
  • 使用 preg_replace 仅替换第一个匹配项

    我有一个结构类似于以下的字符串 aba aaa cba sbd dga gad aaa cbz 该字符串每次都可能有点不同 因为它来自外部源 我只想替换第一次出现的 aaa 但其他人则不然 是否可以 可选的第四个参数预替换 http php
  • 如何包含字符串标头?

    我正在尝试了解strings 但不同的来源告诉我要包含不同的标头 有人说用
  • R 中的字符串作为函数参数

    数据框chocolates列出了糖果的类型以及每种糖果的一组评级 ID sweetness filling crash snickers 0 67 0 55 0 40 milky way 0 81 0 53 0 56 我正在编写一个函数 它
  • 有向未加权图中的最长非循环路径

    什么算法可用于找到未加权有向无环图中的最长路径 动态规划 http en wikipedia org wiki Dynamic programming 它也被引用于最长路径问题 http en wikipedia org wiki Long
  • Javascript正则表达式用于字母字符和空格? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要一个
  • Spark SQL 中的 SQL LIKE

    我正在尝试使用 LIKE 条件在 Spark SQL 中实现联接 我正在执行连接的行看起来像这样 称为 修订 Table A 8NXDPVAE Table B 4 8 NXD V 在 SQL Server 上执行联接 A revision
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • 如何在 IE 中一次性下载多个文件

    我想通过单击 jsp 中的按钮来下载多个文件 我在 js 中使用以下代码来调用一个 servlet 两次 var iframe document createElement iframe iframe width iframe height
  • UIView 动态高度取决于标签高度

    我有一个标签 它动态地从数据库中获取一些数据 这些数据是字符串 有时可以是 3 4 5 行等 所以这个标签位于 UIView 内部 UIView Label 我怎样才能使UIView动态获取标签的特定高度 你可以用这张照片的故事板来做 将标
  • 保护 git 存储库中的文件

    我有一个中央存储库 其中包含我希望防止其他用户更改 通过推送 的文件子集 如果我将这些文件添加到 gitignore 它们不会被克隆 是否可以提供克隆所有文件的能力 但克隆后将其中一些添加到 gitignore在客户端 您可以将文件放在存储
  • WCF 是否始终使用 SOAP 通过绑定发送信息?

    据我所知 您可以从一系列绑定中进行选择 例如 TCP HTTP HTTPS 等 我认为它总是使用 SOAP 通过此连接发送数据是否正确 我正在观看 WCF 指南 其中讨论了如何将异常序列化为 SOAP 并发送到客户端 我本以为并非所有绑定都
  • Android 检查是否有WiFi但上不了网

    我正在编写一个程序 需要检查三种状态 1 如果我没有 WiFi 2 如果我有 WiFi 但没有互联网连接 就像我打开路由器但拔掉以太网电缆 以及 3 如果我有 WiFi 和互联网连接 然后 我会更改应用程序中图标的颜色来代表这些状态之一 红
  • Ctrl+Space 更改键盘,而不是在 Visual Studio 2010 上显示 Intellisense 的自动完成列表

    我注意到 Visual Studio 2010 意外地更改了键盘布局 我尝试了一些解决方案 例如 Going to Windows Control Panel and removing other languages Going to Me
  • 使用 MVVM 从 WPF 应用程序启动对话框/子窗口的标准方法

    所有 我想知道使用 MVVM 模式从 WPF 启动 子 对话框 窗口的公认最佳方法 行业标准 我遇到过以下文章 A CodeProject 使用 MVVM 模式时显示对话框 这种方法对我来说似乎不错 但有些过分了 这是某种程度的代码复制 我
  • Python 3 中大于 10^2000 的数字的平方根

    我想在Python中计算大于10 2000的数字的平方根 如果我将这个数字视为普通整数 我总是会得到这个结果 Traceback most recent call last File line 3 in
  • 在项目“MyProject”上运行构建器“Faceted Project Validation Builder”时出错

    我正在研究 Blackberry webworks Phonegap 框架 Apache Ant 并使用示例 index html 在 Eclipse 3 6 中配置它们 我关注了这篇文章PhoneGap BlackBerry WebWor
  • 您可以从 GitHub 上的命令行发出拉取请求吗?

    似乎您必须与 github com 交互才能发起拉取请求 是这样吗 UPDATE The hub命令现已成为官方github项目 也支持创建拉取请求 ORIGINAL 似乎添加到 hub 命令中特别有用 http github com de
  • ES6 类私有属性只是语法糖吗?

    使用 语法我们现在可以创建私人财产在 ES6 类中是这样的 class Person name constructor name this name name getName return this name let ron new Per
  • Lambda 表达式以及如何组合它们?

    如何使用 OR 将两个 lambda 表达式合并为一个 我已尝试以下操作 但合并它们需要我将参数传递到表达式 调用调用 但是我希望将传递到新 lambda 的值传递到每个子 lambda 上 Expression
  • Java:以编程方式确定类路径上加载的所有包名称

    关于如何找到列表的任何建议包名存在于当前类路径 这需要在运行时由类路径上加载 和执行 的类之一以编程方式完成 即 反了 而不是从外到内 更多细节 我考虑的一种方法是对类加载器迄今为止加载的每个类使用反射 并从中提取包名称 但是 我的应用程序
  • iOS 6 ViewController 正在旋转但不应该旋转

    我希望我的几个应用程序视图控制器在 iOS 6 0 中不旋转 这就是我为使 iOS 6 中的轮换成为可能而所做的 1 在 application didFinishLaunchingWithOptions 中设置 windows rootv
  • 动态生成的 HTML 的格式 - 没人关心吗?

    I have veryWeb开发经验很少 所以这可能是一个非常基本的问题 只是 以我有限的经验来看do有 一点PHP 一点Ruby on Rails 动态生成HTML的方式似乎是格式化的只是 没关系 它最终变得丑陋 有奇怪的缩进 没有人关心
  • 流式传输 xml-conduit 解析结果

    我想用xml conduit 具体来说Text XML Stream Parse为了从大型 XML 文件中延迟提取对象列表 作为测试用例 我使用最近重新发布的 StackOverflow 数据转储 为了简单起见 我打算从中提取所有用户名st
  • 理解范围和数组中的 ruby​​ splat

    我试图理解之间的区别 1 9 and 1 9 如果我将它们分配给变量 它们的工作方式是相同的 splat1 1 9 splat1 1 2 3 4 5 6 7 8 9 splat2 1 9 splat2 1 2 3 4 5 6 7 8 9 但
  • 如何启用/禁用 FloatingActionButton 行为

    我正在开发一些片段中的应用程序 我想隐藏浮动操作按钮 当我设置android 可见性 消失 当我上下滑动时 行为动画向我显示浮动操作按钮 有什么方法可以禁用 启用 FloatingActionButton 行为 谢谢你提前 这是我的代码 Q
  • 使用 JavaScript 算出 DIV 可以容纳多少个字符

    有谁知道使用 JavaScript 计算出 HTML 中的 DIV 块可以容纳多少个字符的最佳方法是什么 任何建议都会有很大帮助 您可以迭代地将字符添加到隐藏的 div 中并检查其宽度 不确定是否有更好的方法 编辑 类似这样的事情 var
  • 查找与所有给定字符串匹配的最简单的正则表达式

    是否有一种算法可以从一组字符串生成正则表达式 可能仅限于简化语法 以便对与正则表达式匹配的所有可能字符串进行求值 从而重现初始字符串集 为具有非常 复杂 语法 包括任意重复 断言等 的正则表达式语法找到这样一种算法可能是不现实的 所以让我们