我在我的代码中使用了正则表达式,如下所示:.*[^0-9].*
但最近我看到一些函数是这样实现的:*[!0-9]*
与第一个例子的目的相同,即非整数。
所以我混淆了正则表达式的真正形式是什么,它们有什么区别。
有人可以在这个问题上帮助我吗?
只有一个正则表达式——第一个。第二个是球状图案。
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 模式。
POSIX 定义:
1)两种类型的正则表达式:BREs 和 EREs。这些由实用程序/内置程序使用。
BRE 受到更多限制,并且存在向后兼容性和在交互式会话中键入更少的内容。如果可能,请避免使用它们,而是使用更灵活且类似于 PERL 的 ERE。
一些实用程序允许您在两种类型的正则表达式之间进行选择。例如,grep
默认匹配 BRE(向后兼容...),但您可以使其匹配 ERE 与-E
.
使用通常必须在将它们传递给实用程序之前引用它们,否则 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)用于文件名扩展的模式,也称为glob(由 POSIX glob
C 函数使用)。这些通常在进入实用程序之前由 shell 扩展并扩展以匹配文件名。如果您引用它们,它们将不再扩展。
*[!0-9]*
is 必须是一个 glob,因为 BRE 和 ERE 使用^
而不是!
.
echo *[!0-9]*
# output: filenames which are not numbers
echo '*[!0-9]*'
# output: *[!0-9]*