在比较Perl中的字符串时,如何忽略重音?

时间:2008-12-22 15:06:04

标签: perl string comparison diacritics

我有这个测验应用程序,我将人们输入的内容与正确答案相匹配。现在,我所做的基本上是:

if ($input =~ /$answer/i) {
     print "you won";
}

这很好,好像答案是“鱼”,用户可以输入“鱼”并被认为是一个很好的答案。

我面临的问题是,我的用户是因为我是法国人,而且我希望能够接受用户输入“taton”,答案是“tâton”。< / p>

所以,我能做的是:

use POSIX qw(locale_h);
use locale;
setlocale(LC_TYPE, "fr_FR.ISO8859-15");
setlocale(LC_COLLATE, "fr_FR.ISO8859-15");

在我的检查程序中,做一个:

$input = lc($input);
$input =~ tr/àáâãäåçèéêëìíîïñòóôõöùúûüýÿ/aaaaaaceeeeiiiinooooouuuuyy/;

和答案一样。

我不喜欢它,因为我必须对事物进行硬编码,而且当我决定离开ISO-8859-15世界以获得UTF-8世界时,我注定要失败。

所以,我正在寻找一种比较字符串的方法,这将使"tâton" eq "taton""maçon" eq "macon""macon" =~ /maçon/成为真。

2 个答案:

答案 0 :(得分:14)

尝试CPAN(或Text::Unaccent)中的Text::Unaccent::PurePerl模块。

答案 1 :(得分:0)

这似乎不是调用正则表达式的合适场合 - 您应该只有一个可接受的答案列表,加上一些过滤来删除不必要的单词,如“a”,“the”和它们特定于语言的等价物。

无论你做什么,对我来说似乎很明显它必须是字符编码感知和语言感知。正则表达式通常都不是。