Questions tagged «regular-expressions»

有关正则表达式的问题,一种描述正则语言的形式主义。

4
如何将有限自动机转换为正则表达式?
使用标准算法(例如汤普森算法),可以很容易地将正则表达式转换为接受相同语言的(最小)NFA 。但是,另一个方向似乎更乏味,有时结果表达式是混乱的。 有什么算法可以将NFA转换为等效的正则表达式?时间复杂度或结果大小是否有优势? 这应该是一个参考问题。请包括您的方法的一般说明以及不重要​​的示例。

1
regex golf NP-Complete吗?
如最近的XKCD摘录和最近的博客文章所示来自Peter Norvig(以及Slashdot故事中的后者),“ regex golf”(可能更好地称为正则表达式分离问题)是定义可能的最短正则表达式的谜题,该正则表达式接受集合A中的每个单词,而在其中不包含任何单词B集。Norvig的帖子中包含用于生成合理的简短候选者的算法,他指出他的方法涉及解决NP完全集覆盖问题,但他也要小心地指出,他的方法并未考虑所有可能的正则表达式,当然,他不一定是唯一的算法,因此不能保证他的解是最优的,而且其他确定的多项式时间算法也有可能找到等效或更好的解。 为了具体起见并避免解决优化问题,我认为正则表达式分隔的最自然表达是: 给定在某个字母两组(有限)字符串和,是否存在长度的正则表达式,该正则表达式接受每个字符串并拒绝每个字符串?一种AA乙BBΣΣ\Sigma≤ ķ≤k\leq k一种AA乙BB 是否知道有关此特定分离问题的复杂性?(请注意,由于我已将和指定为有限的字符串集,因此问题的自然大小概念是和中所有字符串的总长度;这会淹没任何贡献)。在我看来,它很可能是 NP完全的(实际上,我希望这种减少是某种掩护性问题),但是一些搜索并没有发现任何特别有用的东西。一种一种A乙乙B一种一种A乙乙Bķķk

4
如何在有限状态自动机中模拟后向引用,超前查找和向后查找?
此问题是从Stack Overflow 迁移而来的,因为可以在Computer Science Stack Exchange上回答。 迁移 7年前。 我创建了一个简单的正则表达式词法分析器和解析器,以获取一个正则表达式并生成其解析树。对于基本的正则表达式,从此解析树创建非确定性有限状态自动机相对简单。但是,我似乎无法全神贯注于如何模拟反向引用,先行和后备。 从我在紫色龙书中读到的内容中,我了解到,要模拟一个先行,当且仅当匹配项后跟正则表达式匹配项时,才匹配正则表达式,您将创建一个不确定的有限元状态自动机,其中替换为。是否可以创建相同的确定性有限状态自动机?r s / εr /秒r/sr/s[Rrrsss///εε\varepsilon 模拟否定的前瞻性和后瞻性怎么样?如果您将我链接到描述如何详细执行此操作的资源,我将不胜感激。

6
编程语言,正则表达式和形式语言之间的关系是什么
我在网上四处寻找这个问题的答案,似乎每个人都隐含地知道答案,除了我。据推测,这是因为唯一关心的人是受过该学科高等教育的人。另一方面,我却被高中作业深深吸引。 我的问题是,编程语言与形式语言到底有什么关系?在我读过的任何地方,都说着类似“形式语言用于定义编程语言语法”的内容。 现在,根据我的能力,正式语言是一系列适用于一组特定符号(该语言的字母)的生产规则。这些生产规则定义了一组转换,例如: b -> a aaa->c 可以这样应用: abab->aaaa aaaa-> ca 顺便提一句,如果我们将形式语言的字母定义为{a,b,c},则a和b是非终结符,而c是终结符,因为它不能转换(如果我错了,请纠正我那)。 那么,考虑到所有这些,这到底在编程语言中有什么用呢?通常还会指出,正则表达式用于解析其文本形式的语言,以确保语法正确。这很有道理。然后说明正则表达式是由正式语言定义的。正则表达式返回true或false(至少以我的经验),这取决于代表正则表达式的有限状态自动机是否达到目标点。据我所知,这与转换无关。 对于程序本身的编译,我认为一种形式语言可以将代码转换为连续的较低级别的代码,并最终通过一组复杂的规则到达汇编,然后硬件可以理解这些规则。 从我的困惑来看,这就是事实。我所说的内容可能有很多根本上的错误,这就是为什么我要寻求帮助。 *除非您认为某条(a|b)*b*c->true规则类似于生产规则,否则在这种情况下该规则需要一个有限状态自动机(即regex)。就像我们刚才说的那样,这没有任何意义

1
“密集”正则表达式生成
这是一个正则表达式的猜想: 对于正则表达式,令长度是其中的符号数,忽略括号和运算符。例如RRR|R||R||R||0∪1|=|(0∪1)∗|=2|0∪1|=|(0∪1)∗|=2|0 \cup 1| = |(0 \cup 1)^*| = 2 猜想:如果并且包含长度为每个字符串 或更小,则。|R|>1|R|>1|R| > 1L(R)L(R)L(R)|R||R||R|L(R)=Σ∗L(R)=Σ∗L(R) = \Sigma^* 也就是说,如果在的长度范围内“密集” ,则实际上会生成所有东西。L(R)L(R)L(R)RRRRRR 一些可能相关的事情: 仅需要一小部分即可生成所有字符串。例如,对于二进制,将对任何。RRRR=(0∪1)∗∪SR=(0∪1)∗∪SR = (0 \cup 1)^* \cup SSSS 在某个时刻,中必须有一颗Kleene星。如果没有,它将丢失一些小于字符串。。RRR|R||R||R| 很高兴看到一个证明或反例。在某些情况下,我错过了很明显的错误吗?有人看过(或类似的)东西吗?

2
与Perl兼容的正则表达式可以识别哪些语言?
就像标题所说的那样,上周末我花了几个小时试图确定与Perl兼容的正则表达式匹配的语言类别,但不包括允许在模式内执行任意代码的任何匹配运算符。 如果您不知道什么是PCRE,请阅读此内容和本内容。 问题在于,Internet上可用的资源几乎都停留在上下文无关的语言中,PCRE可以匹配的资源更多(参见下文);但是我真的不知道在哪里可以找到更多关于这类东西的定理或论文。 特别是:PCRE显然是常规语言的超集(因为PCRE语法具有所有常规语言运算符)。 任何CFG都可以Greibach正常形式放置,从而消除了左递归。我认为可以通过(?(DEFINE)...)组的方式将语法“翻译”为匹配的子例程,从而避免通过翻译而使左递归阻塞: 每个生产的开头的非终止符成为子例程 (?<HEAD>...) 每个产品的主体都放在子例程中;终端保持原样,非终端成为过程调用(即(?&NONTERMINAL)); 通过|操作员将所有具有与头部相同的非终结符的产品进行“或” 运算((?:...)如果需要,还可以加上与的附加分组) 然后,模式变成一个(?(DEFINE)...)包含所有“翻译的”产生式的组,以及对起始符号过程的调用,以匹配整个字符串,即^(?(DEFINE)...)(?&START)$ 这应该处理任何CFG。因此,PCRE应该能够匹配任何CFL。 还有更多:让我们采用简单的语言 即字符串的语言重复两次。该语言不是CFL-CFL的抽奖引理失败。(尤其要注意 必须保持,因此,您不能仅泵送两个重复字符串的开头或结尾。)| v x w | ≤ pL = { w w | w ^ ∈ Λ∗}大号={ww|w∈Λ∗}L = \{ ww | w \in \Lambda^* \} | vxw | ≤p|vXw|≤p |vxw| \leq p 但是,PCRE可以轻松匹配此语言:^(.*)\1$。因此,我们绝对超越CFL。 以上多少?好吧,正如我所说,我不知道。我找不到关于CSL或介于两者之间的所有其他类的任何资源来下定决心。有专家愿意讨论这个吗? 附录:要求我确切指定必须允许PCRE语法的哪个子集。正如我在文章开头所写的那样,我想排除任何允许在模式内部执行任意代码的运算符,例如??{}。 就参数而言,我认为我们可以坚持使用pcresyntax(3)手册页定义的语法,该语法是Perl 5.10-5.12提供的内容的合理子集,减去了标注(因为它们不在模式内)。我不确定添加或删除回溯控制动词会改变我们可以识别的语言;如果是这样,那么弄清楚我们有哪些类和没有这些类会很好。

1
对一元字母进行反向引用的正则表达式
设置: 具有反向引用的正则表达式 一元语言(1个符号的字母) 在此设置中是否可以确定以下问题: 给定带有反向引用的正则表达式,它是否定义了正则语言? 例如,(aa+)\1定义一种常规语言,而(aa+)\1+没有。我们可以决定是哪种情况吗? 为了具体起见,“带有反向引用的正则表达式”在这里指的是例如与Perl兼容的常规正则表达式的以下子集: a匹配字符a(字母中唯一的字符) X* 匹配0个或多个出现 X X|Y比赛X或Y 括号可用于分组和捕获 \1。\2等匹配与第一对,第二对等括号相同的字符串 我们还可以使用常规的简写形式,例如X+= XX*。

2
对于每个“邪恶”的正则表达式,是否存在非邪恶的替代项,还是语法中的恶魔?
显然,ReDos攻击利用了某些(其他有用的)正则表达式的特征...本质上导致了通过NFA定义的图的可能路径的爆炸式增长。 通过编写等效的“非邪恶”正则表达式可以避免此类问题吗?如果不是这样(因此,NFA无法在实际的空间/时间中处理语法),哪种解析方法会更好?为什么?


3
为什么Kleene星运算符也称为Kleene'closure'运算符?
我发现,如果我不了解CS /编程术语背后的词源,通常意味着我已经错过或误解了一些重要的基本概念。 我不明白为什么Kleene星也被称为Kleene闭合。它与编程中的闭包(具有绑定的非局部变量的函数)有关吗? ...经过反思,也许是因为它允许将开放式集以封闭表达式形式编写? ……以一种古老的橡皮鸭解释方式,现在我猜是这样,但是仍然欢迎权威人士回答。

2
regex填字游戏对NP有用吗?
前几天,我在这个网站上闲逛:http : //regexcrossword.com/,这让我想知道解决它的最佳方法是什么。 您可以在多项式时间内解决以下问题吗?还是NP难? 给定一个NxM网格,其中N个正则表达式用于列,M个用于行,请找到该网格的任何解决方案,以便满足所有正则表达式,或者说不存在任何解决方案。

1
POSIX BRE可以表达所有常规语言吗?
似乎POSIX.1-2008定义的“基本正则表达式” 不支持替换a|b(尽管某些grep实现可以识别转义的版本\|)。 由于按定义,常规语言是根据联合来封闭的,这是否意味着POSIX BRE的表达能力不及有限自动机?还是有某种方法可以使用其他构造来模拟交替?

4
为什么在正则表达式中没有排列?(即使普通语言似乎能够做到这一点)
问题 没有简单的方法来获取正则表达式的排列。 排列:将单词 (“ aabc”)转换为另一个顺序,而无需更改数字或字母种类。w = x1个… xñw=X1个…Xñw=x_1…x_n 正则表达式:正则表达式。 进行验证: “不重复的正则表达式排列”假设这样做会更简单,那么答案将创建JavaScript代码而不是正则表达式。 “如何查找给定文本中给定单词的所有排列” –答案也不使用正则表达式。 “正则表达式匹配所有{1,2,3,4}而不重复” –答案使用了正则表达式,但它既不适应也不简单。 这个答案甚至声称:“正则表达式不能满足您的要求。它不能从字符串生成排列”。 我正在寻找的解决方案 它应具有以下形式: »aabc«(或其他任何可以使用左括号和右括号的内容) (aabc)!(类似于(abc)?,但最后还有另一个符号) [aabc]!(类似于[abc] +,但最后还有另一个符号) 这些解决方案的优势 他们是: 简单 适应性强 可重用 为什么这应该存在 正则表达式是描述常规语言语法的一种方式。他们完全有能力成为任何一种常规语言。 假设常规语言功能强大,可以进行排列(下面有证明)–为什么没有简单的方法来表达这一点? 所以我的问题是: (为什么)我的证明错了吗? 如果正确:为什么没有简单的方法来表达排列? 证据 正则表达式是记录正则语言语法的一种方法。他们可以描述任何常规语言的语法。 描述任何常规语言(字母表中字母数量有限)的另一种语法是非确定性自动机(状态数量有限)。 具有有限数量的字母,我可以创建此自动机:(示例。正式形式:请参见下文) 接受“ abbc”排列的语法: (很抱歉上面的数字,也许有人知道如何使这部分看起来更好) s->ah¹ s->bh² s->ch³ h¹->bh¹¹ h¹->ch¹² h²->ah¹¹(没有错字!等价) h²->bh²² h²->ch²³ h³->ah¹² h³->bh²³ …

3
只能使用2个正则表达式操作无法表达的常规语言
我以为所有常规语言都可以用正则表达式表示(如果某种语言是常规语言,则可以用正则表达式表示),但是有人告诉我,您需要所有这三种常规运算(并置,并集和星号)举行。 例如,有人告诉我,如果我只能使用union和concatenation regex操作(3个中的2个),那将是我不能仅用这两个描述的常规语言。 与Kleene明星和工会相同。有哪些例子?

1
自动机中正则表达式与语法的区别
我是自动机的新手,仅在昨天才对正则表达式进行了简要介绍。我已经阅读了定义正则表达式的各种规则。但是我无法区分正则表达式和某种语言的语法(没有教我正则表达式的语法)。 我知道语法可以帮助我们生成一种语言中的有效字符串,但这就是定义正则表达式状态的规则。那么区别在哪里呢?我问我的教授,他说正则表达式是一种语言中最基本的字符串,语法是任何一种语言的规则集,其顺序比正则表达式高。有人可以提供一些更深入的信息吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.