【问题标题】:How can I ignore accents when comparing strings in Perl?在 Perl 中比较字符串时如何忽略重音符号?
【发布时间】:2010-09-28 00:55:49
【问题描述】:

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

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

很好,好像答案是“鱼”,用户可以输入“一条鱼”并算作一个好答案。

我面临的问题是,我的用户是法国人,我希望能够接受,比如说,用户输入“taton”,答案是“tâton”。

所以,我能做的是:

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/ 为真。

【问题讨论】:

  • 缺点是用户可以输入:“selfish gnomes”,但它们仍然是正确的。
  • 这只是一个例子,而且,他们也可以每次都输入整个字典:-)
  • 你可能想要一些单词边界:m/\b$answer\b/

标签: perl string comparison diacritics


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这似乎不是调用正则表达式的合适场合——您应该简单地列出一个可接受的答案,加上一些过滤以删除非必要的词,如“a”、“the”及其特定语言的等价词。

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

    【讨论】:

      猜你喜欢
      • 2011-01-23
      • 2010-09-26
      • 1970-01-01
      • 2015-02-25
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多