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 關注
- 432 瀏覽
添加回答
舉報