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
,查找相关资料发现,当LANG
为en_US.UTF-8
或者zh_CN.UTF-8
时,在系统的字符集里字母的排列并不是按照ASCII
码的顺序,即ABCDEFG...Zabcdefg...z
,而是aAbBcC...zZ
的顺序。如此便可以解释为什么一开始使用[a-z]
进行识别时不能筛选出小写字母。事实上,该正则表达式筛选出除Z外的所有字母。
如果想要正常筛选大写(或小写)字母,可以选择两种解决方式:- 设置
LC_ALL
:
LC_ALL=C ls [a-z]*
- 使用系统提供的字符类,比如
[[:lower:]]
,[[:upper:]]
,[[:digit:]]
等等,系统会根据当前的字符集保证字符类的正确性
在
C.UTF-8
和C
中的字符集是按照ASCII规范的,因此我们使用[a-z]
或[A-Z]
时是可以正常筛选大小写字母的。2 常见的正则表达式的标识符
*
:识别任意数量任意类型的字符(0个或任意多个)[]
: 方括号表达式识别括号内的任意一个字符。有三个需要注意的地方:[c-a]
是不合法的,不能识别任何字符。而[cba]
是合法的。形如[c-a]
的表达式一定要满足左边的字符要排在右边字符前面。- 方括号表达式还被用于表示系统预定义的字符类,如
[: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}