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

时间:2011-04-04 11:27:35

标签: regex perl

我试图使用以下Perl正则表达式从字符串中找到“花哨的引号”,但它返回false。

$text = "NBN “a joint venture with Telstra”";

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

我也尝试使用“\x93”ascii代码,但仍然无效。我被困在这里。

感谢任何帮助。

此致 阿伦

3 个答案:

答案 0 :(得分:3)

根据您尝试匹配的字符串的编码,您可能需要执行不同的操作。请参阅The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

如果输入字符串是以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 :(得分:1)

请参阅"Demoroniser"以及针对您的具体问题,在Perlmonks Re^3: Reg Ex to strip MS smart quotes上仅讨论“智能”引号。

这个建议假设 - 也许是错误的 - 你的数据库的“花哨的引用”来自一些产生Windows-1252编码文本的微软软件 - 如果你有UTF-8代替,Avi已经指出了你朝着正确的方向前进。

答案 2 :(得分:0)

我最近遇到了一些明智的引用,我无法使用上述帖子中提到的正则表达式来消除这些引用。我不得不做一个我完全通过反复试验发现的技巧:

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

希望这有助于某人。