【问题标题】:What's the difference between * and .* in regular expressions?正则表达式中的 * 和 .* 有什么区别?
【发布时间】:2013-11-09 12:08:06
【问题描述】:

我看到* 的通配符被用在了一些命令中,例如:find *.jpg,这意味着查找所有以.jpg 结尾的文件。但是,在正则表达式中,.* 也意味着任何字符 0 次或更多次。那么,它们之间有什么区别呢?什么时候使用*,什么时候使用.*

【问题讨论】:

  • 你指的是两个不同的东西。文件名搜索中的通配符不是正则表达式,因此它的含义与您描述的一样,与它在正则表达式中的使用无关。
  • 那么,我们什么时候用通配符,什么时候用正则表达式呢?
  • shell 使用通配符以一种有限的正则表达式形式,也称为“通配符”。它使用* 表示零个或多个任何字符,? 表示任何一个字符,并具有基本字符类[A-Za-z] 和否定字符类([!A-Za-z],但要注意认为! 意味着什么的shell歇斯底里——错误,历史)。它远不如 POSIX 和基本级别 grep 中的 BRE(基本正则表达式)强大的正则表达式语言,更不用说 ERE(扩展正则表达式)或 PCRE(与 Perl 兼容的正则表达式)。

标签: regex wildcard glob


【解决方案1】:

在正则表达式中,* 是“零个或多个”重复标记。 . 是“任何单个字符(带有警告)”表达式。

find 中,* 字符是“任何”通配符,并不是真正的正则表达式字符。 ? 是此类搜索情况中的“任何单个字符”。

【讨论】:

  • 不完全。在文件匹配模式中,. 只匹配文字 . 字符。 ? 匹配任何单个字符。看我的回答。
【解决方案2】:

文件名匹配模式(或globs)和正则表达式是两个相似但不同的东西。

对于它们两者来说,大多数字符只是简单地匹配自己,并且某些特殊字符具有特殊含义,可以通过在它们前面加上反斜杠 \ 来消除这些含义。

在文件名匹配模式中(由 shell 和 find 命令使用),? 匹配任何单个字符,* 匹配零个或多个任意字符。 .(句号)不是特殊字符;它只匹配文字 . 字符。

在正则表达式(grep、许多文本编辑器和大多数对文本执行搜索的命令所使用的)中,. 匹配任何单个字符,* 表示其前面的任何内容出现零次或多次。

除此之外还有很多。文件名匹配模式对名称以. 开头的“隐藏”文件有特殊的规则,并且语法和规则在不同shell 之间可能有所不同。正则表达式也以多种形式存在(例如grep vs. egrep,vs. Perl 或 PCRE)。

【讨论】:

    猜你喜欢
    • 2020-08-10
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 2013-04-16
    • 2021-07-14
    相关资源
    最近更新 更多