浅说通字母配符[A-Z][a-z]的匹配问题


内容概要:

1:发现并察觉通字母配符,例如[a-f],[A-F]匹配的结果不全(缺少);

2:查看手册,手册给出的方法与实际结果不符;

3:通过列举方法,计算规律,得出正确的字母通配符结果;

解决的问题:

用正确的字母通配符的规律进行查找;


问题详述:

今天,在上课,练习字母通配符时我们发现了一个貌似是bug的问题,


举个例子:

首先创建了以下文件:

touch f{a,b,c,d,e,A,B,C,D,E};

然后使用通配符执行命令:ll f[a-e] 和命令:ll f[A-E]

            得到的结果却并不是我们想象中的fa-fe或fA-fE这样列出

            来,而是这样:

wKioL1eYsnDjy3XyAAEpR9qTl2s576.jpg-wh_50

            

 

            显然,第一个结果中应该有的"fE"没有,而第二个结果中应该

            有的"fa"也没有,这使我们感到很意外,通过查阅glob通配符

            的帮助手册,发现手册给出的结果应该是我们预想中的样子:


 Ranges

 There is one special convention: two characters separated by '-'  denote  a  range.   (Thus,  "[A-Fa-f0-9]"  is  equivalent  to  "[ABCDEFabcdef0123456789]".)   One may include '-' in its literal meaning by making it the first or last character between the brackets.  (Thus,"[]-]" matches just the two characters ']' and '-', and "[--0]" matches the three characters '-', '.', '0', since '/' cannot be matched.)


然而结果却并不是这样,再变换一下字母,我们发现了更有趣的现象:


wKioL1eYtf7zZ_6rAAE1JE_G0rg932.jpg-wh_50

        原来,通过以上实践案例,我们可以得出以下结论:

      

      用这种指定字母通配符列出的方式时:其规则是:

     

      对于开头的字母:如果是小写,则小大都显示;如果是大写,小写就不显示了.

      对于结尾的字母:如果是小写,大写就不显示了,如果是大写,则小大都显示.

   

注意:    无论是大写还是小写,匹配的结果都是忽略大小写的,也就是说无论你是[a-z]

       还是[A-Z],匹配出来的结果,除了首尾以外,都是既有大写,有些小写的.

        

       所以使用这种方法,要想匹配出全部的结果应该是[a-Z],即:"头小尾大".

       因此,我们要向真正区分大小写,还是要用[:lower:][:upper:]