2 回答
TA贡献1815条经验 获得超6个赞
正则表达式了解一下就知道了,这个是匹配正、负整数的一个表达式,并且允许 0 出现在前面的数字。可以用下面的语句做测试:
[seesea@UC ~]$ if expr "-3" : '-\?[0-9]\+$' >/dev/null; then echo "match OK"; fi;
match OK
[seesea@UC ~]$
[seesea@UC ~]$ if expr "3" : '-\?[0-9]\+$' >/dev/null; then echo "match OK"; fi;
match OK
[seesea@UC ~]$
[seesea@UC ~]$ if expr "03" : '-\?[0-9]\+$' >/dev/null; then echo "match OK"; fi;
match OK
TA贡献1793条经验 获得超6个赞
个人认为,就是完全匹配与部分匹配的差别。
grep 只要字符串中有部分能够与正则匹配即可,并且会输出匹配的一整行。帮助里这样讲:
grep searches the named input FILEs (or standard input) for lines containing (注意,是containing) a match to the given PATTERN. By default, grep prints the matching lines.
如果你在终端里正确设置了颜色显示,那么可以看到:
echo "abcde" | grep "cde" 结果输出 abcde,其中cde是高亮红色显示的(只匹配了部分)。
echo "abcde" | grep ".*cde" 结果也是输出 abcde,其中abcde全是高亮红色显示的。
这表示grep是部分匹配的,只要有部分字符串匹配就OK。
expr STRING : REGEXP 则是完整匹配,输出最后匹配的那个位置(anchor)。帮助里这样说的:
STRING : REGEXP
anchored pattern match of REGEXP in STRING
规定了:后面必须跟正则表达式,用于格式匹配。
.*b 是正则表达式,可用于匹配任何以b结尾的字符串。
但“cde”如果被用作完全匹配的话,就是必须匹配以c开头的字符串,显然匹配不到,因为:前的字符串以a开头。^_^
如果改为 expr "cdeab" : "cde" ,这样就可以匹配成功并且返回3。
看看源码应该能更清楚内部实现方式的区别。我没看过,因此也不好多说了。以上纯属个人看法,仅供探讨。
- 2 回答
- 0 关注
- 376 浏览
添加回答
举报