正则表达式和通配符概念的区别

首先,shell通配符和正则表达式是风马牛不相及的东西。请首先树立这个概念。

 

    通配符,说白了一般只用于文件名匹配,它是由shell解析的。所谓的系统level的概念非常含糊,什么是系统level的?我们知道shell是一个命令解释器,它是内核的外壳,用于完成操作系统使用者与内核的沟通,因此,通配符实际上就是一个shell解释器去解析的符号,它的特殊涵义是由shell这个命令解释器赋予的。通配符的英文名是wildcard,就是万用牌的意思,它相当简单,一般来说,*nix系统上面的shell大多将三个特殊符号当作通配符,它们是 * ? [...],其中 * 表示匹配任意长度的任意字符; ? 表示匹配一个任意字符,而[...]则表示匹配括号中列出的字符中的任意一个。

 

    其次。什么是正则表达式(regularexpression, 缩写是regex.)?从简单的角度去理解,你可以把正则表达式看成是一种字符串匹配模式标准。这里最重要的就是,它本身,只是一种业界流行的标准,或者说,它是相当于对字符串匹配模式的一种规定。这种规定是随着相关的工具软件的发展而自称体系的“不成文规矩”。

   -- 举个例子好了。假设首先有一种工具软件能够根据“模式(pattern)”搜索字符串,这个工具非常流行,以至于后续的工具软件都效仿那个工具软件定义的模式规则来匹配字符串 -- 慢慢的就形成标准,而且相对来说是一种不成文的规矩.

    所以,正则表达式是什么?-- 它是一种对字符串匹配模式的描述和规定 -- 并且是一种标准。而不同的工具程序,也就是egrep、sed、awk这样的程序,以各种程度来支持这种字符串搜索模式,它们就是标准的实现,你可以在这种软件中使用正则表达式这种“匹配模式标准”。 -- 明白?

 

    所以,在什么地方使用通配符?答案是只要是shell命令行或者shell脚本中,你都可以使用通配符;

    在什么地方使用正则表达式?当你使用能够支持正则表达式的工具软件进行字符串处理时你就可以使用正则表达式。你还可以在支持正则表达式的语言中使用正则表达式,比如perl, java... C++中也有专门用于支持正则表达式的库。正则表达式总是和“使用什么工具软件或者语言”相关。相对来说,不同的工具和语言对正则表达式的支持程度不同,*nix里面将这些工具软件的对正则表达式的支持分类,因此也就有了“基础正则表达式”和“扩展正则表达式”。

   

    不同的工具对正则表达式的支持,其实有些许的微妙不同;但是总体来说,使用正则还是基本按照标准来的。这些不同的工具支持程度,被称之为“正则流派”。而工具软件中支持这种匹配模式的那部分代码,称之为“正则引擎”。由于perl对正则表达式的支持非常到位,其正则引擎也比较优秀,因此perl语言算是正则的一大流派,目前大部分对正则的支持都或多或少参考了perl语言中的标准。

 

 

 

    嗯。现在你应该明白了,我说shell通配符的*和正则表达式的*为什么是两回事。因为shell通配符和正则表达式根本就是两回事。

    实际上,它们的涵义也不一样。shell通配符表示“去匹配0到任意个任意字符”,比如 *.c 表示匹配 xxx.c yyy.c zzz.c ...

    而在正则表达式中,"*"表示,“去匹配重复0到任意个*前的那个字符”。比如, oo* 表示匹配 o, oo, ooo, oooo...

 

 

LZ,给点鼓励,我打了好多字~看来我十分好为人师... 见笑了。我也是粗通此理,见LZ正好疑惑,所以不禁胡言乱语了一通。若我有误则请多多包涵... 吾生也有涯,而知也无涯,以有涯随无涯,殆矣... 我自然也有各种要请教的...

 

 

比如查找当前目录下的后缀为.c的文件。你可以使用 
   $ find . -name *.c
   在这个命令中, 首先shell读入整个命令行,然后对这个命令行进行解析。当然, “*.c” 也由shell解析了。


   你还可以使用一个命令:
   $find . -name "*"  | grep '[.]c$'
   在这个命令中,首先shell读入整个命令行,然后对整个命令行进行解析。注意,find . -name "*",这里的"*"是由shell解析的,它代表了任意文件。

   然后,find出来的结果通过管道,由grep再进行处理。我们看到grep里面使用了正则表达式 [.]c$, 而且这个正则表达式是用单引号包围起来的,单引号包围的目的就是告诉shell解释器:你不要解析这里面(单引号包围的部分)的东西了,这里面的东西应该原封不动地送给grep工具解析。

   所以,为什么使用grep的时候,一个好的习惯是把正则表达式用单引号围起来?原因就是避免shell先对正则表达式中的“*”进行了解析,然后再把一个不正确的正则表达式(被shell先解析并更改了的)送给grep.
   

   再次重申。虽然,通配符的*也可以看成是一种字符串匹配模式,但是它是由shell进行解析的字符串匹配模式,跟由支持正则的工具软件解析的“正则字符串匹配模式”完全不同,是风马牛不相及的东西。(当然,非要说它们(shell和正则工具)的字符搜索引擎实现原理可能有些关联之类的,我无话可说)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值