使用双阴性:
/[^\S\n]/
为避免平台差异在perlport中警告\w和\n的映射:
/[^\S\x0a\x0d]/
也就是说,对于排除CR和NL的模式,不是空白或不是新行和类似。
使用De Morgan定律分配外部非(即字符类中的补充\w),这相当于“空白而不是回车而不是换行”,但是不要相信我的话:
#! /usr/bin/env perl
use strict;
use warnings;
use 5.005; # for qr//
my $ws_not_nl = qr/[^\S\x0a\x0d]/;
for (' ', '\f', '\t', '\r', '\n') {
my $qq = qq["$_"];
printf "%-4s => %s\n", $qq,
(eval $qq) =~ $ws_not_nl ? "match" : "no match";
}
输出:
" " => match
"\f" => match
"\t" => match
"\r" => no match
"\n" => no match
请注意排除垂直制表符,但这在v5.18中已得到解决。
这个技巧对于匹配字母字符也很方便。 请记住,\w匹配“单词字符”,字母字符以及数字和下划线。 我们丑陋的美国人有时会想把它写成,比方说,
if (/^[A-Za-z]+$/) { ... }
但是双负字符类可以尊重语言环境:
if (/^[^\W\d_]+$/) { ... }
这有点不透明,因此POSIX字符类可能更好地表达意图
if (/^[[:alpha:]]+$/) { ... }
或者像szbalint建议的那样
if (/^\p{Letter}+$/) { ... }