2011-04-04 64 views
5

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

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

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

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

任何帮助表示赞赏。

问候, 艾伦

+0

我测试你的正则表达式在http://www.regextester.com/和它的工作。但它只找到第一个报价。关于你的问题,我没有写任何珍珠,但据我所见,珍珠中的其他正则表达式正在编写,例如'$ vmsn =〜/(。+ \。vmsn)/ xm;',所以你的正则表达式会看起来像'/“/ m'。 – 2011-04-04 11:40:31

+3

'“(U + 201C)不在US-ASCII字符集中。 – Gumbo 2011-04-04 11:46:36

+0

@MPękalski,你是对的。我使用评估工具测试了正则表达式,它工作。但它在Perl脚本中不起作用。 – Allen 2011-04-04 12:09:25

回答

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'

您还可以指定use utf8如果你想脚本本身的编码为UTF-8。你可能最好,但是,知道你是检查字符的代码点,并直接指定它:

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 2011-04-04 11:48:25

+0

谢谢Avi。它确实有用!这花了我近一个小时,我仍然无法弄清楚什么是错的。非常感谢您的帮助。我一定会检查你推荐的文章 - 没有任何借口! – Allen 2011-04-04 12:07:04

+1

如果 “使用UTF-8”,请确保您的源代码,实际上是UTF8) – 2011-04-04 12:31:56

0

我最近碰到,我不能排除使用仅上述职位提到的正则表达式-ES一些智能引号来了。我不得不做一个把戏,我完全通过反复试验发现:

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

希望这可以帮助别人。

+0

究竟是哪个4个正则表达式? – 2015-05-05 12:20:04