我在我的代码中使用了正则表达式,如下所示:.*[^0-9].*
但是最近我看到一些函数实现如下:*[!0-9]*
出于与第一个例子相同的目的,即非整数。
所以我混淆了正则表达式的真正形式以及它们之间的区别。
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:4)
只有一个正则表达式 - 第一个。第二个是glob模式。
有关Bash支持的POSIX扩展正则表达式的描述,请参阅regex(7): http://man7.org/linux/man-pages/man7/regex.7.html
有关glob模式的说明,请参阅Bash手册:http://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html
Bash仅在[[...]]命令中使用正则表达式:http://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html
Bash使用glob模式来处理其他所有事情。
答案 1 :(得分:1)
POSIX定义:
1)两种正则表达式:BREs and EREs。这些由实用程序/内置函数使用。
BRE受到更多限制,并且为了向后兼容而存在,并且在交互式会话中输入较少。尽可能避免使用它们,而是使用ERE,它们更灵活,类似于PERL。
某些实用程序允许您在两种类型的正则表达式之间进行选择。
例如,grep
默认情况下与BRE匹配(向后兼容性...),但您可以将其与-E
的ERE匹配。
使用通常必须在将它们传递给实用程序之前引用它们,或者shell将文件名扩展它们。
.*[^0-9].*
可以是BRE或ERE。在这两种情况下,它与Perl正则表达式相同,它相当于glob *[!0-9]*
。
BRE和ERE之间的主要区别在于,ERE会添加更多有用的Perl,例如(a|b)
,a{m,n}
,a+
,a?
等特殊字符。例子:
echo a | grep '(a|b)'
# output:
echo a | grep -E '(a|b)'
# output: a
echo a | grep 'a{1,2}'
# output:
echo a | grep -E 'a{1,2}'
# output: a
2)Patterns Used for Filename Expansion,也称为 globs (由POSIX glob
C函数使用)。这些通常在转到实用程序之前由shell扩展,并展开以匹配文件名。如果你引用它们,它们就不再扩展了。
*[!0-9]*
必须是一个glob,因为BRE的ERE使用^
代替!
。
echo *[!0-9]*
# output: filenames which are not numbers
echo '*[!0-9]*'
# output: *[!0-9]*