为何启用PCRE的GNU grep中`[\d]`无法正常工作?
问题:为什么
grep -P '[\d]'无法匹配数字? 我注意到执行grep -P '[\d]' <<< 'asdf 1234 asdf'无法正常工作,而grep -P '[0-9]' <<< 'asdf 1234 asdf'符合预期。当\d在方括号外使用时,可正常生效。请问[\d]无法工作的原因是什么?
相关环境信息:
grep (GNU grep) 3.10 Copyright (C) 2023 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later https://gnu.org/licenses/gpl.html. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Written by Mike Haertel and others; see https://git.savannah.gnu.org/cgit/grep.git/tree/AUTHORS.
原因解析
在GNU grep的-P(Perl兼容正则)模式下,字符类(方括号[])内部不支持Perl风格的简写字符类(比如\d、\w等):
- 当
\d被放在方括号内时,它会被解析为字面量字符'd',而非匹配任意数字的简写规则。所以grep -P '[\d]'实际是在匹配字符串中的'd'字符,而非数字,自然不符合匹配数字的预期。 - 当
\d在方括号外时,它是Perl正则的标准数字匹配简写,等价于ASCII环境下的[0-9],因此能正常匹配数字。
而[0-9]是直接指定数字范围的基础正则写法,无论在字符类内部还是外部都能正确匹配0-9的数字,所以可以得到预期结果。
内容的提问来源于stack exchange,提问作者tukusejssirs
相关产品推荐
相关产品推荐

