常用通配符和正则表达式的误区

通配符适用的地方:shell命令行或者shell脚本中,一般用来匹配文件名的。

正则表达式适用的地方:字符串处理时,一般有一般正则和Perl正则。

最近写shell的时候发现一直以来对正则和通配符的理解有偏差,让我们再认识一下这几个基本的符号。

1,通配符

 ﹡ 匹配所有:匹配0个到多个的任意的字符。

  ?匹配任意单个字符

  
[ ! ] 匹配 不在中括号内的一个字符 (和正则中的 [ ^ ]作用相似,都是反向选择)

当要把以上的* ,?,[ ]当成参数或者字符串处理时,就要限制shell不能当成通配符。这时的处理方法是:加单引号或者用\(反斜杠转义)

2.正则表达式

  

字符匹配

.:匹配任意单个字符

*:匹配其前面一个字符出现任意次(区别与通配符的一到多个字符)

?:匹配其前面的字符1次或0次

+:匹配其前面一个字符出现至少一次(在扩展正则表达式中)

位置匹配

^:锚定行首

$:锚定行尾

\<或\b:锚定词首,其后面的任意字符必须作为单词首部出现

\>或\b:锚定词尾,其前面的任意字符必须作为单词尾部出现

\B:非单词的开头或结尾

^$:空白行

   

分组匹配用() :

(ac)* :匹配ac这个分组出现任意次

\1:引用第一个左括号以及与之对应的右括号所包括的所有内容,同理还有\2,\3

断言匹配 

java仅支持<name>形式;而在其他语言中,或者在正则的设计中还有(?“name”)的格式
零宽断言
<?=exp>
<?!=exp>
<?!<=exp>
<?<=exp>

^(.(?<!that))*this(.(?<!that))*$ 
^(.(?<!that))*this((?!that).)*$ 
^((?!that).)*this(.(?<!that))*$ 
^((?!that).)*this((?!that).)*$ 
这4个正则表达式测试上述的几句话,结果都能够满足要求。

懒惰模式
懒惰限定符
代码/语法 说明
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
懒惰的限定符
分组和反向引用
(?<name>.[a-z]*?)(/d)
表达式内可以使用    /2  来使用

猜你喜欢

转载自www.cnblogs.com/anyehome/p/8951881.html