【问题标题】:Perl Regular Expression cannot find fancy quotes “Perl 正则表达式找不到花哨的引号“
【发布时间】:2011-04-04 11:27:35
【问题描述】:

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

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

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

我也尝试使用“\x93”ascii 代码,但仍然无法正常工作。我被困在这里了。

感谢任何帮助。

问候, 艾伦

【问题讨论】:

  • 我在regextester.com 测试了你的正则表达式,它成功了。但它只找到了第一个报价。关于你的问题,我没有用珍珠写过任何东西,但据我所见珍珠人正在写其他正则表达式,例如$vmsn =~ /(.+\.vmsn)/xm;,所以你的正则表达式看起来像/“/m
  • (U+201C) 不在 US-ASCII 字符集中。
  • @MPękalski,你是对的。我使用评估工具测试了正则表达式并且它有效。但它在 Perl 脚本中不起作用。

标签: regex perl


【解决方案1】:

根据您尝试匹配的字符串的编码,您可能需要做不同的事情。见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";
}

【讨论】:

  • @Avi: 关闭大括号/\N{U+201C}/
  • 谢谢阿维。它确实有效!我花了将近一个小时,我仍然无法弄清楚出了什么问题。非常感谢您的帮助。我一定会检查您推荐的文章 - 没有任何借口!
  • 如果您“使用 utf8”,请确保您的源代码实际上是 utf8 ;)
  • 你不需要\N{U+201C}:如果你有use utf8if ($text =~ m/“/) 就可以工作。
  • 我将借此机会插入 perl5i,它会打开 utf8 并避免这种用户挠头。 :)
【解决方案2】:

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

这个建议是假设 - 可能是错误的 - 你的数据库的“花式引号”来自一些产生 Windows-1252 编码文本的 Microsoft 软件 - 如果你有 UTF-8 而不是,Avi 已经指出你在右边方向。

【讨论】:

    【解决方案3】:

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

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

    希望这对某人有所帮助。

    【讨论】:

    • 上面提到的究竟是哪4个正则表达式?
    猜你喜欢
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    相关资源
    最近更新 更多