3

我在我的代码中使用了正则表达式,如下所示:.*[^0-9].*

但最近我看到一些函数是这样实现的:*[!0-9]*与第一个例子的目的相同,即非整数。

所以我混淆了正则表达式的真正形式是什么,它们有什么区别。

有人可以在这个问题上帮助我吗?

4

2 回答 2

4

只有一个正则表达式——第一个。第二个是球状图案。

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 模式。

于 2013-11-04T08:30:06.227 回答
1

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 globC 函数使用)。这些通常在进入实用程序之前由 shell 扩展并扩展以匹配文件名。如果您引用它们,它们将不再扩展。

*[!0-9]*is 必须是一个 glob,因为 BRE 和 ERE 使用^而不是!.

echo *[!0-9]*
# output: filenames which are not numbers

echo '*[!0-9]*'
# output: *[!0-9]*
于 2013-11-04T07:49:03.357 回答