POSIX规范下的正则表达式



  • 1 POSIX规范下的正则表达式

    在使用ls或者grep等Linux命令时,会遇到需要使用正则表达式的场景,例如:

        ls [a-z]*
    

    该命令将打印当前目录下以小写字母开头的文件

        ls [^a-z]*
    

    该命令将打印当前目录下除了以小写字母开头外的文件
    但是,在实际操作的时候可能会遇到这样的情况,就是[a-z]*并不能将文件名以小写字母开头的文件筛选出来,而是将以任意字母开头的文件全部打印出来,这又是为什么呢?
    其实,我们只需要键入locale命令,即可拿到当前系统环境下的本地设置:

    LANG=en_US.UTF-8
    LANGUAGE=
    LC_CTYPE="en_US.UTF-8"
    LC_NUMERIC="en_US.UTF-8"
    LC_TIME="en_US.UTF-8"
    LC_COLLATE="en_US.UTF-8"
    LC_MONETARY="en_US.UTF-8"
    LC_MESSAGES="en_US.UTF-8"
    LC_PAPER="en_US.UTF-8"
    LC_NAME="en_US.UTF-8"
    LC_ADDRESS="en_US.UTF-8"
    LC_TELEPHONE="en_US.UTF-8"
    LC_MEASUREMENT="en_US.UTF-8"
    LC_IDENTIFICATION="en_US.UTF-8"
    LC_ALL=
    

    看到第一行的LANG,查找相关资料发现,当LANGen_US.UTF-8或者zh_CN.UTF-8时,在系统的字符集里字母的排列并不是按照ASCII码的顺序,即ABCDEFG...Zabcdefg...z,而是aAbBcC...zZ的顺序。如此便可以解释为什么一开始使用[a-z]进行识别时不能筛选出小写字母。事实上,该正则表达式筛选出除Z外的所有字母。
    如果想要正常筛选大写(或小写)字母,可以选择两种解决方式:

    1. 设置LC_ALL:
    LC_ALL=C ls [a-z]*
    
    1. 使用系统提供的字符类,比如[[:lower:]],[[:upper:]],[[:digit:]]等等,系统会根据当前的字符集保证字符类的正确性

    C.UTF-8C中的字符集是按照ASCII规范的,因此我们使用[a-z][A-Z]时是可以正常筛选大小写字母的。

    2 常见的正则表达式的标识符

    • *:识别任意数量任意类型的字符(0个或任意多个)
    • []: 方括号表达式识别括号内的任意一个字符。有三个需要注意的地方:
      1. [c-a]是不合法的,不能识别任何字符。而[cba]是合法的。形如[c-a]的表达式一定要满足左边的字符要排在右边字符前面。
      2. 方括号表达式还被用于表示系统预定义的字符类,如[:lower:],[:upper:][:digit:]等。
    • ^: 表示“非”的意思,如[^[:lower:]]可以识别除小写字母外所有的字符。




  • @dorence 感谢分享,这里还有一份方便记忆的表格供大家参考 : )

    POSIX Description ASCII Unicode Shorthand Java
    [:alnum:] Alphanumeric characters [a-zA-Z0-9] [\p{L}\p{Nl} \p{Nd}] \p{Alnum}
    [:alpha:] Alphabetic characters [a-zA-Z] \p{L}\p{Nl} \p{Alpha}
    [:ascii:] ASCII characters [\x00-\x7F] \p{InBasicLatin} \p{ASCII}
    [:blank:] Space and tab [ \t] [\p{Zs}\t] \h \p{Blank}
    [:cntrl:] Control characters [\x00-\x1F\x7F] \p{Cc} \p{Cntrl}
    [:digit:] Digits [0-9] \p{Nd} \d \p{Digit}
    [:graph:] Visible characters (anything except spaces and control characters) [\x21-\x7E] [^\p{Z}\p{C}] \p{Graph}
    [:lower:] Lowercase letters [a-z] \p{Ll} \l \p{Lower}
    [:print:] Visible characters and spaces (anything except control characters) [\x20-\x7E] \P{C} \p{Print}
    [:punct:] Punctuation (and symbols). [!"\#$%&'()*+,\-./:;<=>?@[\\]^_‘{|}~] \p{P} \p{Punct}
    [:space:] All whitespace characters, including line breaks [ \t\r\n\v\f] [\p{Z}\t\r\n\v\f] \s \p{Space}
    [:upper:] Uppercase letters [A-Z] \p{Lu} \u \p{Upper}
    [:word:] Word characters (letters, numbers and underscores) [A-Za-z0-9_] [\p{L}\p{Nl} \p{Nd}\p{Pc}] \w \p{IsWord}
    [:xdigit:] Hexadecimal digits [A-Fa-f0-9] [A-Fa-f0-9] \p{XDigit}

 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

与 Dian 的连接断开,我们正在尝试重连,请耐心等待