使用字符类:
[0-9]
匹配
0
、
9
和它们之间的每个字符,至少在 Unicode(例如 UTF-8)和子集字符集(例如 US-ASCII、Latin-1)中,它们是数字
1
到
8
。因此,它匹配任何一个拉丁数字中的10个数字之一。
if [[ $var1 == *,123[0-9][0-9][0-9],* ]] ; then echo "Pattern matched"; fi
使用=~
而不是==
可以将模式类型从Shell标准的“glob”模式更改为正则表达式(简称“regexes”)。您可以使等效的正则表达式更短一些:
if [[ $var1 =~ ,123[0-9]{3}, ]] ; then echo "Pattern matched"; fi
第一处简化来自于
[[ =~ ]]
只需要正则表达式匹配字符串的任意部分,而不是整个字符串。因此,您不需要像在通配符模式中找到的前导和尾随的
*
等价物。
第二个长度缩短是由于
{n}
语法,它允许您指定前一个模式的重复次数,而不必在正则表达式中重复该模式本身。(您也可以通过指定最小值和最大值来匹配一系列重复计数:
[0-9]{2,4}
将匹配连续的两个、三个或四个数字。)
值得注意的是,您还可以使用命名字符类来匹配数字。根据您的区域设置,
[[:digit:]]
可能与
[0-9]
完全等效,或者它可能包括具有 Unicode“Number, Decimal Digit”属性的其他脚本的字符。
if [[ $var1 =~ ,123[[:digit:]]{3}, ]] ; then echo "Pattern matched"; fi
[0-9]
匹配0
到9
这个范围内的字符,取决于(有效的)LC_CTYPE
值(请参见locale
)。在现在普及的基于 UTF-8 的语言环境中,这与ASCII / Latin-1 字符0
到9
重叠,因为这些编码是 Unicode 的真正子集。相比之下,[[:digits:]]
不仅匹配0
到9
,还可以匹配额外的 UTF-8 字符,基于 Unicode 标准认为是数字。 - mklement0