正则表达式的定义是什么?


10

我最近与Ghoti进行了友好的辩论,认为在回答这个问题的评论中,正则表达式是什么构成的。我声称以下是一个正则表达式:

`[Rr]eading[Tt]est[Dd]ata`

Ghoti不同意,声称它是文件文件。维基百科上的全局页面声称(强调我的):

Globs不包含Kleene星的语法,该语法允许多次重复表达式的前一部分;因此,它们不被视为正则表达式,可以在任何给定的有限字母上描述更大的一组正则语言。

但是,此声明没有引用,表明这只是特定维基百科编辑的意见。

单一UNIX®规范,版本2,指出一个基本的正则表达式(BRE),甚至可以是单个字符:

普通字符是与之匹配的BRE:受支持的字符集中的任何字符,但BRE特殊字符中列出的BRE特殊字符除外。

那么,* nix世界中正则表达式的定义是什么,该定义是否排除文件glob?


6
在理论CS中,正则表达式是对正则语言的描述,该语言可以由有限自动机识别。在Unix世界中,它要复杂得多,并且没有单一的定义。有在POSIX规范2种正则表达式方言:扩展和基础,将使用该工具,如grepsedawk。Vim和Perl一样使用自己的品种。
2012年

因此,根据该定义,文件全局 BRE吧?
terdon

2
不会,文件文件不是 BRE-您认为它是什么?如果您阅读了BRE的POSIX描述和globlob的POSIX描述,您会发现它们并不相同。例如,*在BRE和glob中有两个不同的含义。注意:我不认为POSIX规范中的任何地方都使用glob一词-而是将其称为模式匹配,并在Shell语言一章中进行了描述
2012年

Answers:


10

由于LK-说,-name的选项find将把参数作为水珠,而不是一个正则表达式。

字符串是解释为glob还是正则表达式,还是仅解释为纯字符串,取决于用于进行解释的内容。这是背景问题。您示例中的字符串[Rr]eading[Tt]est[Dd]ata可以通过许多不同的方式求值,但是字符串的类型取决于您的使用方式。用它作为一个球,这是一个球。将其用作正则表达式,这是一个正则表达式。在问题起源于此的情况下,OP将字符串描述为正则表达式。因此,我们可以假设他打算将其解释为正则表达式。

绝对地,单个字符也可以是正则表达式。它也可以是字符串,也可以是glob。如果愿意,可以将其解释为字节或tinyint。这完全取决于上下文。

有多种形式的正则表达式规范。BRE和ERE有据可查。PCRE添加了大量功能。许多正则表达式解释器将实现例如“所有ERE和PCRE的一部分”。否则,他们将减去某些功能而进行ERE。如果您遵循正式的规范,那么许多工具都声称支持正则表达式,但事实证明它是不正确或不完整的。了解细节可以使您的解决方案适应正在评估正则表达式的任何工具中可用的功能集合。

所以...如果您正在寻找“排除”全局变量的定义,那么您是从错误的角度来看待这个问题。 它是您的使用方式决定的。


7

[Rr]eading[Tt]est[Dd]ata看起来既可以作为全局表达式又可以用作正则表达式,并且我认为在两种解释中都具有相同的“含义”。但是,-name选项find将将参数视为全局,而不是正则表达式。

如果提供一个参数(例如)foo*,则该区别将很重要,该参数既是有效的glob也是有效的正则表达式,但是根据解释的不同,其含义也不同:

如果解释为glob模式,这将匹配foofoobarfoo123,等。

如果解释为正则表达式,将匹配fofoofoooooo,等。


谢谢,我看到了全局模式和正则表达式之间的区别。正则表达式的正式定义是什么?
terdon

1
我不知道“正则表达式”是否有一个统一的定义。有不同的语法规范,例如POSIX正则表达式或Perl正则表达式,其中包括其他“功能”,例如反向引用或超前。从严格意义上讲,它们可能不再是正则表达式(在正则形式语言的上下文中),但仍称为正则表达式。
lk- 2012年
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.