【发布时间】:2016-06-20 18:27:52
【问题描述】:
阅读comment by Charles Duffy我遇到一个问题:使用=或=~检查简单的正则表达式有什么区别吗?
当我们只想检查一个字符串是否是另一个字符串的一部分时,这些选项是等效的:
$ [[ hello = *el* ]] && echo "yes"
yes
$ [[ hello =~ el ]] && echo "yes"
yes
如果将正则表达式存储在变量中,也会发生同样的情况:
$ re="[0-9]"
$ number=2
$ [[ $number = $re ]] && echo "yes"
yes
$ [[ $number = *$re* ]] && echo "yes"
yes
但是,检查非文字字符串不适用于=,需要使用=~:
$ date=20160620
$ [[ $date = [0-9]{4}(0[0-9]|1[0-2])([0-2][0-9]|3[0-1]) ]] && echo "yes"
bash: syntax error in conditional expression: unexpected token `('
bash: syntax error near `[0-9]{4}(0'
$ [[ $date =~ [0-9]{4}(0[0-9]|1[0-2])([0-2][0-9]|3[0-1]) ]] && echo "yes"
yes
$ [[ $date =~ ^[0-9]{4}(0[0-9]|1[0-2])([0-2][0-9]|3[0-1])$ ]] && echo "yes"
yes
在一般性能和 POSIX 方面应该使用什么?
注意所有这些都是基于我的GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)。
【问题讨论】:
-
这就是 globbing 和 Regex 之间的区别。
=使用通配符,而=~使用正则表达式。 -
如果您有选择,请选择正则表达式以提高效率;它通常更快。见stackoverflow.com/q/18412294/1566221。但正则表达式不是 posix。