为了账号安全,请及时绑定邮箱和手机立即绑定

以下内容是关于linux/unix shell 中expr 字符串匹配问题,麻烦大佬指教!

以下内容是关于linux/unix shell 中expr 字符串匹配问题,麻烦大佬指教!

明月笑刀无情 2021-08-31 17:13:52
expr "abcde" : ".*b"结果为2,即匹配.*b这个正则表达式时,正好ab能够匹配上,其长度为2,所以返回2。但 expr "abcde" : "cde"这里cde也可以理解为一个正则表达式,但为什么返回值是0呢,明明能够匹配到cde这个串嘛?即echo "abcde" | grep 'cde' 明明 是可以匹配到的么?为什么expr不行?
查看完整描述

2 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

个人认为,就是完全匹配与部分匹配的差别。

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。

看看源码应该能更清楚内部实现方式的区别。我没看过,因此也不好多说了。以上纯属个人看法,仅供探讨。

查看完整回答
反对 回复 2021-09-06
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

帮助里这样说的:
STRING : REGEXP
anchored pattern match of REGEXP in STRING

规定了:后面必须跟正则表达式,用于格式匹配。
.*b 是正则表达式,可用于匹配任何以b结尾的字符串。
cde 就是一个固定字符串STRING,不符合要求的格式。当然,这里shell将它作为正则表达式来解释,就变成匹配以c开头的字符串,显然匹配不到,因为:前的字符串以a开头。^_^
如果改为 expr "cdeab" : "cde"
就可以匹配到并且返回3。
——————————————————————————————————————
匹配方式不同,作用也不同。
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.

grep 只要字符串中有部分能够与正则匹配即可,并且会输出匹配的一整行;
expr STRING : REGEXP 则是完整匹配,输出最后匹配的那个位置(anchor)。

如果你在终端里正确设置了颜色显示,那么可以看到:
echo "abcde" | grep "cde" 结果输出 abcde,其中cde是高亮红色显示的(只匹配了部分)。
echo "abcde" | grep ".*cde" 结果也是输出 abcde,但其中abcde都是高亮红色显示的。

看看源码应该能更清楚内部实现方式的区别。我没看过,因此也不好多说了。以上纯属个人看法,仅供探讨。
很欣赏你这种探究到底的精神。



查看完整回答
反对 回复 2021-09-06
  • 2 回答
  • 0 关注
  • 383 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信