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

ter*_*don 10 regular-expression

我最近与Ghoti就我对这个问题的回答的评论中的正则表达式的构成进行了友好的争论。我声称以下是正则表达式:

`[Rr]eading[Tt]est[Dd]ata`
Run Code Online (Sandbox Code Playgroud)

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

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

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

The Single UNIX® Specification, Version 2指出基本正则表达式 (BRE) 甚至可以是单个字符:

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

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

gho*_*oti 10

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

将字符串解释为 glob 或 regex 还是仅解释为普通字符串取决于用于进行解释的内容。这是一个上下文问题。您示例中的字符串[Rr]eading[Tt]est[Dd]ata可以通过多种不同的方式进行评估,但它什么取决于您如何使用它。将它用作 glob,它是一个 glob。将它用作正则表达式,它是一个正则表达式。对于起源问题,OP 将字符串描述为正则表达式。因此我们可以假设他计划将其解释为正则表达式。

绝对的,单个字符也可以是正则表达式。也可以是字符串,也可以是glob。如果您愿意,它可以被解释为一个字节或一个 tinyint。这一切都取决于上下文。

有多种形式的正则表达式规范。BRE 和 ERE 有据可查。PCRE 添加了大量功能。例如,许多正则表达式解释器将实现“所有 ERE 和一些 PCRE”。或者他们会做 ERE 减去一些功能。如果您遵循正式规范,许多工具声称支持正则表达式,结果证明是不正确或不完整的。了解细节可以让你的解决方案适应评估正则表达式的任何工具中可用的功能集合。

所以......如果你正在寻找“排除”全局的定义,那么你是从错误的角度来看这个的。 它是什么取决于你如何使用它


lk-*_*lk- 7

[Rr]eading[Tt]est[Dd]ata似乎既可用作 glob 又可用作正则表达式,并且我相信这两种解释具有相同的“含义”。但是,-name选项find会将参数视为 glob,而不是正则表达式。

如果您提供诸如 的参数,这种区别将很重要foo*,它既是有效的 glob 又是有效的正则表达式,但根据解释具有不同的含义:

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

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