Regex 否定/倒排字符类无法匹配perl中的方括号
在下面的语法中, 我希望不是拉丁26个字母的字母表中的每个字符都能转换成下划线Regex 否定/倒排字符类无法匹配perl中的方括号,regex,perl,Regex,Perl,在下面的语法中, 我希望不是拉丁26个字母的字母表中的每个字符都能转换成下划线。 但是,正如我们所看到的,方括号不被认为是该字符类中的字符: > printf '%s' 'dog[-1]cat' | perl -p -e 'use strict; use warnings; s/[^A-za-z]/_/g;'; echo; dog[__]cat > perl --version This is perl 5, version 18, subversion 4 (v5.18.4) b
。
但是,正如我们所看到的,方括号不被认为是该字符类中的字符:
> printf '%s' 'dog[-1]cat' | perl -p -e 'use strict; use warnings; s/[^A-za-z]/_/g;'; echo;
dog[__]cat
> perl --version
This is perl 5, version 18, subversion 4 (v5.18.4) built for darwin-thread-multi-2level
(with 2 registered patches, see perl -V for more detail)
为了得到我想要的,我必须明确地提到方括号,如下所示:
> printf '%s' 'dog[-1]cat' | perl -p -e 'use strict; use warnings; s/[^A-za-z]/_/g; s/[\[\]]/_/g;'; echo;
dog____cat
否定/倒置的概念似乎很简单;我错过了什么
还有一种更优雅的说法来实现我想要的,例如不使用两个顺序替换吗?字符集
[^a-za-z]
包括a-z
而不是a-z
——也就是说,它包括大写a
和小写z
之间的ASCII格式的所有内容,包括Z
和a
之间的点号:
⋮
X
Y
Z
[
\
]
^
_
`
a
b
c
⋮
将[^A-za-z]
更改为[^A-za-z]
应该可以解决它。我的错误是双重的
s/[^[:alpha:]/ug/g;'
可以,但我无法解释为什么你的版本不起作用,所以我不会写一个答案:-)哈,我错过了小写的z
。使用预定义的字符类有一些优点,如[:alpha::
:-)@Ted lynmo谢谢!
~/u/kh/bin> echo 'dog[-1]cat' | perl -p -e 'use strict; use warnings; s/[^A-Za-z]/_/g;'; echo;
dog____cat_
~/u/kh/bin> echo 'dog[-1]cat' | perl -p -e 'use strict; use warnings; s/[^[:alpha:]]/_/g;'; echo;
dog____cat_
~/u/kh/bin>