为什么正则表达式的Unicode属性适用于这种类型的字符串?

时间:2013-08-05 19:57:04

标签: regex perl unicode

在以下脚本中,为什么if评估为true,为什么要打印Has space!

p{Space}Unicode属性,对吗?但是$_不包含Unicode句子而是ASCII句子。这个脚本是如何工作的?

#!/usr/bin/perl

use strict;
use warnings;

$_ = "yabba dabba doo";

if(/\p{Space}/){
    print "Has space!\n";
}

1 个答案:

答案 0 :(得分:0)

它被评估为true,因为你的字符串中有一个空格(\s)。你也可以这样写:

if ( $_ =~ /\s/ ) { .. }

重点是它不会检查整个字符串。当你想检查整个字符串是否一个空格时,你应该写下这样的内容:

if ( $_ =~ /^\s+$/ ) { .. } 

或使用Unicode:

if ( $_ =~ /^\p{PosixSpace}$/ ) { .. } 

在您的情况下,您不使用ASCII范围,您使用POSIX范围以及PosixSpace的同义词。它也不区分大小写,这使得原始空间适合您的空间;)

同义词列表位于 Properties accessible through \p{} and \P{} (请参阅第3239点)。 POSIX字符类及其Unicode和Perl等价物列表(第三个块对您有意义)在 Character classes 中。

也许您想使用\p{PerlSpace}