Perl正则表达式无法找到“花式引号”

5
我尝试使用以下Perl正则表达式从字符串中找到“fancy quotes”,但它返回false。
$text = "NBN “a joint venture with Telstra”";

if ($text =~ m/“/)
{
  print "found";
}

我也尝试使用"\x93" ASCII代码,但仍然没有效果。我卡在这里了。
感激任何帮助。
问候, Allen

我在http://www.regextester.com/上测试了你的正则表达式,它有效。但是它只找到了第一个引号。关于你的问题,我没有写过任何珍珠语言的东西,但是据我所见,其他人在珍珠语言中编写的正则表达式,例如`$vmsn =~ /(.+.vmsn)/xm;,因此你的正则表达式看起来像是/“/m`。 - MPękalski
3
“(U+201C)不属于US-ASCII字符集。 - Gumbo
@MPękalski,你是对的。我使用了一个评估工具测试了正则表达式,它是有效的。但是在Perl脚本中它就是不起作用。 - Allen Qin
3个回答

4
根据您要匹配的字符串的编码方式,您可能需要做不同的事情。请参见Unicode和字符集的绝对最低限度(没有任何借口!)
如果输入字符串是使用UTF-8编码的,则需要在perl脚本中指定该编码 - 一种方法是使用use encoding 'UTF-8'
如果您想要脚本本身的编码为UTF-8,则可以指定use utf8。但是,最好知道要检查的字符的代码点,并直接指定它:
use utf8;
use encoding 'UTF-8';

$text = "NBN “a joint venture with Telstra”"; # Make sure to quote this string properly

if ($text =~ m/\N{U+201C}/) # “ is the same as U+201C LEFT DOUBLE QUOTATION MARK
{
  print "found";
}

1
@Avi:请关闭大括号/\N{U+201C}/ - Toto
谢谢你,Avi。它确实有效!我花了将近一个小时,仍然无法弄清楚问题出在哪里。非常感谢你的帮助。我一定会查看你推荐的文章 - 没有任何借口! - Allen Qin
1
如果你使用了 "use utf8",请确保你的源代码实际上是 utf8 编码 ;) - Øyvind Skaar
1
你不需要使用\N{U+201C}:如果你使用了use utf8,那么if ($text =~ m/“/)就可以工作了。 - user181548
我将借此机会推荐perl5i,它可以打开utf8并避免这种用户头痛的情况。 :) - Schwern
显示剩余4条评论

1

0

最近我遇到了一些智能引号,使用上面帖子中提到的正则表达式无法消除。我不得不通过试错找到一个技巧:

  • 首先使用Encode::encode将其转换为iso-8859-1。
  • 接下来,使用上述4个正则表达式转换花式引号。
  • 然后使用Encode::encode将字符串转换为UTF-8(我需要这样做,因为我在iOS应用程序中使用该字符串,并使用“NSString stringWithUTF8String:”从SQLite数据库中读取它 - 可能与您无关)。

希望这能帮助到某些人。


1
上面提到的那4个正则表达式是哪几个? - Adriano Varoli Piazza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接