regexp何时不是正则表达式?


9

自从我学习我的正式语言大学课程,我偶然发现了这些迷人的职位( ),它描述了如何使用一个找到一个素数的正则表达式。正如我所说的,是regexp而不是正则表达式。由于正则表达式可以匹配有限状态自动机计算的字符串,而FSA不能找到素数,因此博客文章中显示的regexp并不完全是正则表达式,因为它会回溯以匹配字符串。

由于我从未真正使用过任何正则表达式,因此,我的问题是:

我如何仅通过查看就可以从“真正的”正则表达式中立即识别出一个正则表达式?

定义:通过正则表达式,我指的是形式语言中定义的概念。regexp是指现代编程语言支持的概念。regexp语法通常包含其他功能,例如反向引用。在编程语言中看到的正则表达式严格比形式语言样式的正则表达式更强大


5
Regexp只是正则表达式的缩写。素数的计算基于Perl hack,而不是基于正则表达式。

1
这很简单。常规语言使用串联,重复和交替。每当引擎支持的功能不等同于这些功能时,它都是非常规的。
Kilian Foth,2015年

1
相关的问题:123
拉斐尔

@Yannis如果跳过篱笆到达CS,那就不再是事实了。在编程语言中看到的正则表达式严格地比(形式语言样式)正则表达式更强大,并且缩写形式“正则表达式”按惯例(我不知道它的广泛性)用于前者,而不是后者类。
拉斐尔

@KilianFoth但这并不是一个真正有用的描述。例如,您可以在不增加正则表达式功能的情况下向其添加否定符(或者实际上是布尔连接符的任何有限集合)。
David Richerby

Answers:


13

tl; dr backrefs。

一旦\1正则表达式中有一个(或任何不用于转义unicode的数字),它就不是正则表达式。

Backrefs允许您匹配(a+)b\1匹配n次的匹配项,a然后a对所有n> 1 匹配b ,再匹配n次。这不是常规语言(它是非常规语言的后代)。

backref引用包含一个与任意长字符串匹配的regexp或包含*or 的组是必要且几乎足够的+。(我发现)形式(A)B\1A的一种正则表达式的唯一例外(其中A是一种有限的语言)(可以用接受它们的所有单词的枚举代替)。您可以将其转换为word1+Bword1|word2+Bword2等。因为A是有限的。

环顾组不会删除正则表达式的常规性。A(?=B)C是正则表达式的横截面AB.*AC和的2种正则语言的横截面是规则的。负前瞻相似,除了使用的补码B.*(常规语言的补码是常规的)。回顾后是完全一样的,以及A(?<=B)C是的横截面AC.*BC


这是必要和充分的吗?在我看来(a)\1,使用backref时,它等效于琐碎的aaRegular。我也想知道超前断言是否可以用于识别非常规语言。
MSalters

1
@MSalters:如果您想真正掌握技术,(a)\1不是正则表达式,而是可以识别常规语言。
约尔格W¯¯米塔格
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.