1

我只是在寻找一些关于最佳实践的建议。检查空字符串或仅包含空格字符的字符串的最佳方法是什么?

我通常使用这样的正则表达式$string =~/^\s*$/来查看变量是否为空白。有没有更被接受的方式,或者这和其他方式一样好?使用正则表达式或 chomp 然后检查空字符串更好吗?

谢谢。

4

2 回答 2

3

就个人而言,我通常会颠倒意义,并搜索单个非空白字符。所以我会说:

next unless $string =~ /\S/;

正如 ikegami 所提到的,\s(and \S) 对于究竟哪些字符被视为空白可能有点特殊,您可以使用\p{Whitespace}(或在我的情况下\P{Whitespace})以获得更一致的结果。

出于好奇,我not /\S//^\s*\z/. 在 80 个字符的字符串(使用 Perl 5.14.2)上,我发现not /\S/空格字符串的速度大约快 20% /^\s*\z/,非空格字符串的速度大约快 30%。检查空行不太可能成为程序的瓶颈,但使用更简单的正则表达式肯定没有坏处。

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%   --

非空格的示例结果:

          Rate negU  neg  pos
negU 4951234/s   --  -3% -24%
neg  5112271/s   3%   -- -22%
pos  6555251/s  32%  28%   --
于 2012-06-04T06:50:19.600 回答
2

这非常好(虽然/^\s*\z/会少一些冗余)。

注意:它不会匹配垂直制表符 (U+000B)。你可以使用\p{Whitespace}它。

注意:一个错误使它在某些时候只匹配无间断空格 (U+00A0),除非使用use 5.012;or /u\p{Whitespace}不受该错误的影响。

于 2012-06-04T05:48:57.657 回答