我最近与戈蒂关于什么是我的回答的评论中的正则表达式这问题。我声称以下是正则表达式:
`[Rr]eading[Tt]est[Dd]ata`
Ghoti 不同意,声称它是一个文件 glob。这全局维基百科页面声称(强调我的):
Glob 不包含 Kleene 星号语法,该语法允许多次重复表达式的前面部分;因此,它们不被视为正则表达式,正则表达式可以在任何给定的有限字母表上描述更大的正则语言集。
然而,这一说法没有被引用,表明这只是特定维基百科编辑的观点。
这单一 UNIX ® 规范,版本 2,指出基本正则表达式 (BRE) 甚至可以是单个字符:
普通字符是与自身匹配的 BRE:受支持的字符集中的任何字符,除了 BRE 特殊字符 中列出的 BRE 特殊字符。
那么,*nix 世界中正则表达式的定义是什么?该定义是否排除文件 glob?
答案1
正如lk-所说,选项-name
会将find
参数视为全局变量,而不是正则表达式。
字符串是否被解释为 glob、正则表达式或只是普通字符串取决于用于解释的内容。这是一个上下文问题。您示例中的字符串[Rr]eading[Tt]est[Dd]ata
可以通过多种不同的方式进行评估,但是它是什么是取决于你如何使用它。将其用作 glob,它就是一个 glob。将其用作正则表达式,它是正则表达式。在这种情况下问题起源于哪里,OP将该字符串描述为正则表达式。因此我们可以假设他计划将其解释为正则表达式。
单个字符绝对也可以是正则表达式。它也可以是一个字符串,也可以是一个glob。如果您愿意,它可以被解释为一个字节或一个tinyint。这一切都取决于上下文。
正则表达式有多种不同形式的规范。 BRE 和 ERE 有详细记录。 PCRE 添加了大量功能。例如,许多正则表达式解释器将实现“所有 ERE 和部分 PCRE”。或者他们会做 ERE 减去一些功能。如果您遵循正式规范,许多工具都声称支持正则表达式,但事实证明这是不正确或不完整的。了解详细信息可以使您的解决方案适应评估正则表达式的任何工具中可用的功能集合。
所以......如果您正在寻找“排除”全局的定义,那么您正在从错误的角度看待这个问题。 这是什么取决于你如何使用它。
答案2
[Rr]eading[Tt]est[Dd]ata
似乎作为 glob 和正则表达式都有效,并且我相信在两种解释中具有相同的“含义”。但是,-name
选项find
会将参数视为全局变量,而不是正则表达式。
如果您提供诸如 之类的参数,这种区别将很重要foo*
,它既是有效的 glob 又是有效的正则表达式,但根据解释具有不同的含义:
如果解释为 glob 模式,则这将匹配foo
、foobar
、foo123
等。
如果解释为正则表达式,它将匹配fo
、foo
、foooooo
等。