否定/反转字符 class 无法匹配 perl 中的方括号
negated / inverted character class fails to match square bracket in perl
在下面的语法中,在 perldoc 之后,
我希望每个不在拉丁 26 字母表中的字符都被转换为下划线 _
.
但是,方括号不被识别为这个字符 class,正如我们看到的:
> 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
negation/inversion的概念看似简单;我错过了什么?
有没有更优雅的说法来实现我想要的,例如不使用两个顺序替换?
字符集 [^A-za-z]
包括 A-z
而不是 A-Z
-- 也就是说,它包括大写字母 A
和小写字母 z
之间的所有 ASCII 字符],包括Z
和a
之间的标点:
⋮
X
Y
Z
[
\
]
^
_
`
a
b
c
⋮
将 [^A-za-z]
更改为 [^A-Za-z]
应该可以解决问题。
我的错误是双重的。
- hand-written 字符中的粗心错误,如响应者所指出的那样
- 我的无知
[:alpha:]
posix class(也感谢回复者),虽然看过很多次,就是没学会
~/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>
在下面的语法中,在 perldoc 之后,
我希望每个不在拉丁 26 字母表中的字符都被转换为下划线 _
.
但是,方括号不被识别为这个字符 class,正如我们看到的:
> 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
negation/inversion的概念看似简单;我错过了什么?
有没有更优雅的说法来实现我想要的,例如不使用两个顺序替换?
字符集 [^A-za-z]
包括 A-z
而不是 A-Z
-- 也就是说,它包括大写字母 A
和小写字母 z
之间的所有 ASCII 字符],包括Z
和a
之间的标点:
⋮
X
Y
Z
[
\
]
^
_
`
a
b
c
⋮
将 [^A-za-z]
更改为 [^A-Za-z]
应该可以解决问题。
我的错误是双重的。
- hand-written 字符中的粗心错误,如响应者所指出的那样
- 我的无知
[:alpha:]
posix class(也感谢回复者),虽然看过很多次,就是没学会
~/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>