我只是在寻找有关最佳实践的建议。检查空字符串或仅包含空格字符的字符串的最佳方法是什么?
我通常使用像$string =~/^\s*$/
这样的正则表达式来查看变量是否为空。是否有更容易接受的方式或者这种方式与其他方式一样好?使用正则表达式或者选择并检查空字符串是否更好?
感谢。
答案 0 :(得分:3)
就个人而言,我通常会颠倒感觉,并搜索单个非空白字符。所以我会说:
next unless $string =~ /\S/;
正如池上所提到的那样,\s
(和\S
)对于哪些字符被认为是空格有点特殊,你可以使用\p{Whitespace}
(或者在我的情况下{{1} }})以获得更一致的结果。
出于好奇,我对\P{Whitespace}
与not /\S/
进行了基准测试。在80个字符的字符串(使用Perl 5.14.2)上,我发现/^\s*\z/
对于空格字符串的速度提高了大约20%,而对于非空格字符串,not /\S/
的速度提高了约30%。检查空白行不太可能是程序中的瓶颈,但使用更简单的正则表达式肯定没有坏处。
/^\s*\z/
空格的示例结果:
use Benchmark 'cmpthese';
our $text = ' ' x 80;
#our $text = 'abcd' x 20;
cmpthese(-3, {
'pos' => '$text =~ /^\s*\z/',
'neg' => 'not $text =~ /\S/',
'negU' => 'not $text =~ /\P{Whitespace}/',
});
非空格的示例结果:
Rate pos negU neg
pos 3562012/s -- -2% -15%
negU 3651619/s 3% -- -13%
neg 4194275/s 18% 15% --
答案 1 :(得分:2)
这很好(虽然/^\s*\z/
不那么多余。)
注意:它与垂直标签(U + 000B)不匹配。您可以使用\p{Whitespace}
。
注意:除非使用use 5.012;
或/u
,否则错误会使其仅在某些时间与No-Break Space(U + 00A0)匹配。 \p{Whitespace}
不受该错误的影响。