2011-04-04 65 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