Регулярное выражение Perl не может найти необычные кавычки - PullRequest
5 голосов
/ 04 апреля 2011

Я пытался найти необычные кавычки «из строки, используя следующее регулярное выражение Perl, но он возвращает false.

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

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

Я также пытался использовать код "\x93" ascii, но все равно не работает. Я застрял здесь.

Любая помощь приветствуется.

С уважением, Аллен

Ответы [ 3 ]

3 голосов
/ 04 апреля 2011

В зависимости от кодировки строки, которую вы пытаетесь сопоставить, вам может потребоваться выполнить разные действия. См. Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать о Unicode и наборах символов (без оправданий!) .

Если входная строка закодирована в 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 голос
/ 05 апреля 2011

См. «Деморонизер» , а для вашей конкретной проблемы - обсуждение всего лишь «умных» цитат из этого на Perlmonks Re ^ 3: Reg Ex для удаления MS Smartкавычки .

Этот совет предполагает - возможно, неправильно - что "причудливые кавычки" вашей базы данных получены из некоторого программного обеспечения Microsoft, производящего кодированный в Windows-1252 текстесли вместо этого вы получили UTF-8 , Avi уже указала вам правильное направление.

0 голосов
/ 15 марта 2014

Недавно я натолкнулся на некоторые умные цитаты, которые я не мог устранить, используя регулярные выражения, упомянутые только в вышеприведенных постах.Мне пришлось сделать трюк, который я обнаружил полностью методом проб и ошибок:

  • Сначала конвертируйте в iso-8859-1, используя Encode :: encode.
  • Затем конвертируйте фантазиюкавычки (используя 4 регулярных выражения, упомянутых выше).
  • Затем преобразуйте строку в UTF-8, используя Encode :: encode (мне это нужно, поскольку я использовал строку в приложении для iOS и читал ее из SQLiteбаза данных с использованием «NSString stringWithUTF8String:» - может быть не относится к вам).

Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...