【问题标题】:Why does the Unicode properties for a regular expression apply for this type of string?为什么正则表达式的 Unicode 属性适用于这种类型的字符串?
【发布时间】:2013-08-05 19:57:03
【问题描述】:

在下面的脚本中,为什么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";
}

【问题讨论】:

  • ASCII 是 Unicode 的子集。
  • 好吧,我对 Perl 了解不多,但在任何语言中,所有 ASCII 字符都是 Unicode。 Unicode 字符串专门用于匹配 Unicode 字符。当然,Unicode 字符串可能与 ASCII 字符串不同。但反之亦然。
  • @Jim 从程序员的角度来看,Perl 不会以某种编码方式保存字符串。它将字符串保存为代码点序列。字符串中空格字符的代码点与 Unicode“空格”属性匹配。
  • 此外,Unicode 匹配规则适用于 (a) 字符串包含 > 0xFF 的字符或 (b) 正则表达式使用 Unicode 功能,如 \p。
  • 标准 7 位 ASCII 是 Unicode 的真子集,Perl 内部的一切都是 Unicode。此外,ASCII 的 UTF-8 编码使所有字符保持不变。编码或表示成为问题的唯一时间是当您使用代码点大于 0x7F 的字符时。

标签: regex perl unicode


【解决方案1】:

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

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

关键是它不检查整个字符串。当您想检查整个字符串 是否 是一个空格时,您应该编写如下内容:

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

或使用 Unicode:

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

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

同义词列表在 Properties accessible through \p{} and \P{} 中(查看第 3239 点)。 Character classes 中列出了 POSIX 字符类及其 Unicode 和 Perl 等价物(第三块对您来说很有趣)。

也许你想使用\p{PerlSpace}。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 2011-02-19
    • 2015-07-22
    相关资源
    最近更新 更多