正则表达式与用于过滤文件的通配符有何不同

use*_*539 18 ls grep

虽然我们使用*来表示 0 个或多个前面的字符grep*.c但当我们将它与ls诸如ls *.c. 有人能说出*在这两种情况下的使用有何不同吗?

War*_*ung 31

Shell 文件名通配符正则表达式使用一些相同的字符,它们具有相似的用途,但您是对的,它们不兼容。文件名通配是一个功能要弱得多的系统。

在文件名通配中:

  • * 表示“零个或多个字符”

  • ? 意思是“任何单个字符”

但是在正则表达式中,您必须使用.*来表示“零个或多个字符”,并且.表示“任何单个字符”。A?在正则表达式中的含义完全不同:前一个 RE 元素的零个或一个实例。

方括号 ( []) 在我正在输入的系统上的两个系统中的工作方式相同,至少对于简单的情况是这样。这包括诸如 POSIX 字符类(例如[:alpha:])之类的东西。也就是说,如果您需要您的命令在许多不同的系统类型上工作,我建议不要使用超出基本内容的任何东西,例如字符列表(例如[abeq])和字符范围(例如[a-c])。

这些差异意味着这两个系统只能在简单情况下直接互换。如果您需要文件名的正则表达式匹配,则需要以另一种方式进行。find -regex是一种选择。(请注意,find -name顺便说一下,还有 使用 glob 语法。)

  • 正则表达式的两种主要风格是 POSIX 和 PCRE(Perl Compatible RE)。后者不那么冗长,并且具有更多功能。Unix 工具和 shell 通常使用 POSIX,大多数带有内置正则表达式的编程语言(shell 除外)使用 PCRE。当您在线阅读材料时,请注意差异。 (4认同)
  • 此外,还有各种口味的正则表达式。并非所有正则表达式都是一样的!并且您还有许多其他模式匹配系统,例如 SQL _like_,其中 `'%'` 表示 `'*'`。 (3认同)
  • 我不知道它被称为通配 :) (2认同)

jll*_*gre 12

回答原标题中表达的问题:

为什么正则表达式与用于过滤文件的表达式不同?

文件名扩展早于正则表达式,在大多数操作系统(通配符/小丑字符)中已经存在,并且比后者更简单和直观。

虽然普通*.txt用户很容易理解,但类似.*\.txt的东西更适合有经验的用户/程序员,更不用说^.*\.txt$......

  • `*.txt` 不等于 `.*\.txt`,它(大部分)等于 `.*\.txt$` 因为在 `.txt` 之后不能有任何内容(至少假设 *reasonable* 文件名通配)。甚至可能是`^.*\.txt$` 多少取决于用法。证明你的观点? (3认同)
  • “为什么”部分的另一个原因:速度。正则表达式较慢:http://pastebin.com/3iNCgkE3 (2认同)