正则表达式或 glob 中是否包含感叹号(!)?

正则表达式或 glob 中是否包含感叹号(!)?

在许多文章中,他们从来没有在 glob 中包含 '!',这是错误的。那么, ! 真正属于 哪里?

我在 glob 中使用了 ! 例如。ls lis[!ta]* 这是否意味着 ! 是 glob 的一部分?

答案1

!在 shell 全局变量和正则表达式中均有使用。它不“属于”其中任何一者。

在您给出的例子中:

ls lis[!ta]*

这是 POSIX 否定(或补充)字符类的方式。从man 7 glob

   Complementation

   An expression "[!...]" matches a single character, namely any character
   that is not matched by the expression obtained by  removing  the  first
   '!'  from it.  (Thus, "[!]a-]" matches any single character except ']',
   'a' and '-'.)

(一些 shell 还支持^补码,以与正则表达式语法保持一致)。它也用于 ksh/bash扩展的 glob为了类似的目的,例如

!(foo|bar)

匹配除foo或之外的任何字符bar。有关此用法,请参阅 shell 的手册页 -man bash例如:

          ?(pattern-list)
                 Matches zero or one occurrence of the given patterns
          *(pattern-list)
                 Matches zero or more occurrences of the given patterns
          +(pattern-list)
                 Matches one or more occurrences of the given patterns
          @(pattern-list)
                 Matches one of the given patterns
          !(pattern-list)
                 Matches anything except one of the given patterns

在 perl 兼容正则表达式 (PCRE) 中, !也用于否定环视,例如

foo(?!bar)

匹配foo除其后跟 之外的字符bar。例如参见

相关内容