- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想在基于 DFA 的正则表达式匹配器中实现“词边界”匹配。谁能告诉我这是怎么做到的?
为了提供一些背景知识,我目前正在使用“dk.brics.automaton”库,但它不支持断言(例如 \b
,字边界)。我需要使用基于 DFA 的引擎,因为我的主要目标实际上是确定正则表达式的等价性,而不是进行实际匹配。
此外,以下问题的答案似乎表明这是可能的: DFA based regular expression matching - how to get all matches?通过说
"Again, we manage this by adding an epsilon transition with special instructions to the simulator. If the assertion passes, then the state pointer continues, otherwise it is discarded."
不过,我不太明白这是什么意思。这是否表明它只能通过一种特殊类型的 epsilon 转换来完成,这种转换会查看其端点,并且只有在其端点满足断言时才能遍历,或者它是否可以通过以某种方式配置的“正常”epsilon 转换来完成?如果我需要这些“特殊”类型的 epsilon 转换,那么如何确定它们(即转换为标准 DFA)?
非常感谢任何关于如何实际实现它的描述的指针。
最佳答案
您不能使用纯 DFA 实现来执行环视类型的正则表达式引擎。由于您需要跟踪之前看到的内容,因此您正在将引擎变成一个不同的野兽,它将上下文保存在内存中以便进行模式匹配。
要让正则表达式引擎处理这意味着它需要有特殊的转换来查看已解析内容的上下文。普通的 DFA 不能这样做,因为这个上下文被丢弃了。顺便说一句,这也是为什么捕获组很慢以及为什么匹配 (.*)something(.*)
在某些引擎上非常慢的原因,因为它会将大量字符复制到缓冲区中以保持这一点上下文。
我假设您将尝试最小化两个生成的 DFA 并查看它们是否相等,以便解决您的问题。如果您在执行状态最小化算法时将每个“特殊”转换处理为唯一且只能与与其自身相等的转换合并,则这仍然可以实现。
关于java - 如何使用 DFA 正则表达式匹配器实现正则表达式断言/环视(即\b 样式词边界),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10066669/
我最近在读一篇论文 Algorithms to Accelerate Multiple Regular ExpressionsMatching for Deep Packet Inspection关于
我正在备考,完成了图中这个任务 通常,从 NFA 到 DFA 的转换对我来说很容易。我从 NFA 创建一个转换表,并为每个"new"组合状态创建一个新列等等(看看我的尝试解释得更好) 不知何故,我对
我正在练习我的 DFA,我遇到了这个似乎非常复杂的问题。我试着把它分成两个较小的问题,我有一个答案,但它看起来不适合我。 有人可以帮助我,或者至少给我一些提示。 顺便说一下,它们都是接受状态。 我能想
正如标题所示,我希望有人帮助我编写 NFA 到 DFA 的转换的代码。我只需要伪代码。我试过用谷歌搜索,甚至找到了整个源代码,但是几乎没有资源可以帮助我给我一个正式的方法(用书面文字,而不是通过图片)
我有一个关于 DFA 最小化的问题。所以我使用了众所周知的技术将正则表达式转换为 NFA,然后使用 goto/closure 算法从中构造 DFA。现在的问题是如何将其最小化?我在这里看过有关它的课文
我已经在纸上编写了DFA,并希望将其转换为一组正则表达式。有人知道这样做的好工具吗? 最佳答案 从我的Google小搜索中,我找到了JFLAP。他们也有关于how to Convert FA to r
一个多小时以来,我一直在尝试不同的方法来解决这个问题,但我感到非常沮丧。 问题是:给出以下每种语言在 Sigma = {0,1} 上的正则表达式和 DFA。 a). {w ∈ Σ* | w 包含偶数个
我正在学习如何使用配对表法(系统化约简法)来约简 DFA。这是我们要约简的 DFA。 第一步是在表格中布置 DFA: 0
有人能告诉我所附的 DFA 是否正确吗? 我想为具有字母 Σ ={a, b} 的语言提供 DFA 我需要 DFA ----> A={ε, b, ab} 最佳答案 不,有多种原因: 您的自动机 bab
我的程序应该为二进制字符串实现 dfa...dfa 是一台一次只能处于一种状态的机器(当您输入字符串时,机器应该使用它,并且在最后一步它应该到达最终状态。如果是这样,我们说该字符串被机器接受)...这
我想创建一个 O(1) 复杂度的自动机的转换函数。我在考虑使用 HashMap 或 Binary tree 。那些想法好吗?你有什么建议吗?感谢您的关注:) 最佳答案 如果您确实需要对转换函数进行持续
我有一个 DFA A 和一个 CFG G,然后我必须检查 G 是否生成了 A 不接受(被 A 拒绝)的无限单词,以及一个不错的复杂度时间。 我想用 CFG 构造一个图,如果它包含有向循环,则生成无限语
我正在查看将 DFA 转换为正则表达式的时间复杂度分析“Introduction to the Automata Theory, Languages and Computation”,第 2 版,第
我需要生成一个确定性有限自动机 (DFA),它是从满足以下属性的所有可能的 DFA 中选出的。必须选择均匀分布的 DFA。 DFA 必须具有以下四个属性: DFA 有 N 个节点。 每个节点都有 2
我有一个 DFA (Q, Σ, δ, q0, F) 和一些“不关心的转换”。这些转换模型符号已知在某些情况下不会出现在输入中。如果采取任何此类转换,则结果字符串是否被接受都无关紧要。 是否有一种算法可
我有一个程序,它只是将所有状态作为一组状态作为输入。然后下一个输入是状态集合中的初始状态,然后是最终状态集合。 接下来是我在状态之间进行的一组转换。 例如:q0,1,q1 这意味着在输入 1 上存在从
在修改封闭源代码游戏时,我在运行时修改机器代码以跳转到我自己的代码中。为了以通用方式执行此操作,我使用模式匹配来查找我想要修改的代码位置。 (模式仅由字符/字节和通配符组成,其中字节可以变化。)通过从
从这个语法开始:https://stackoverflow.com/a/14287002/1082002我会实现一个简单的语法来接受和评估这样的简单语言: { if a==c { a
有了 DFA 的图表,如何将其转换为图灵机?我是否必须找到 DFA 接受的语言,然后创建图灵机?或者有直接的方法吗? 谢谢你。 最佳答案 DFA 中的每个转换读取输入的一个字符,跟随一个转换,然后移动
我希望在我的词法分析器中实现一个 DFA 最小化器,但我似乎无法生成一个看起来不像它已经是表达式的最小 DFA 的 DFA。 我正在从 NFA 构建 DFA,该 NFA 是使用后缀正则表达式中的汤姆森
我是一名优秀的程序员,十分优秀!