通配符适用的地方:shell命令行或者shell脚本中,一般用来匹配文件名的。
正则表达式适用的地方:字符串处理时,一般有一般正则和Perl正则。
最近写shell的时候发现一直以来对正则和通配符的理解有偏差,让我们再认识一下这几个基本的符号。
1,通配符
﹡ 匹配所有:匹配0个到多个的任意的字符。
?匹配任意单个字符
[ ! ] 匹配 不在中括号内的一个字符 (和正则中的 [ ^ ]作用相似,都是反向选择)
当要把以上的* ,?,[ ]当成参数或者字符串处理时,就要限制shell不能当成通配符。这时的处理方法是:加单引号或者用(反斜杠转义)
2.正则表达式
字符匹配
.:匹配任意单个字符
*:匹配其前面一个字符出现任意次(区别与通配符的一到多个字符)
?:匹配其前面的字符1次或0次
+:匹配其前面一个字符出现至少一次(在扩展正则表达式中)
位置匹配
^:锚定行首
$:锚定行尾
<或:锚定词首,其后面的任意字符必须作为单词首部出现
>或:锚定词尾,其前面的任意字符必须作为单词尾部出现
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 来使用