我正在搜索“卡扎菲”这个词,这个词有很多种拼写方式。搜索这个最好的正则表达式是什么?

以下是30个变体的列表:

Gadaffi
Gadafi
Gadafy
Gaddafi
Gaddafy
Gaddhafi
Gadhafi
Gathafi
Ghadaffi
Ghadafi
Ghaddafi
Ghaddafy
Gheddafi
Kadaffi
Kadafi
Kaddafi
Kadhafi
Kazzafi
Khadaffy
Khadafy
Khaddafi
Qadafi
Qaddafi
Qadhafi
Qadhdhafi
Qadthafi
Qathafi
Quathafi
Qudhafi
Kad'afi

目前为止我最好的尝试是:

\b[KG]h?add?af?fi$\b

但我似乎还是遗漏了一些变体。有什么建议吗?


当前回答

还有什么是以Q, G或K开头,中间有d, z或t,并以人们实际搜索的“fi”结尾的呢?

/\b[GQK].+[dzt].+fi\b/i

完成了。

>>> print re.search(a, "Gadasadasfiasdas") != None
False
>>> print re.search(a, "Gadasadasfi") != None
True
>>> print re.search(a, "Qa'dafi") != None
True

有趣的是,我被否决了。有人能在评论里留下一些假阳性吗?

其他回答

从潜在拼写列表中需要注意的一件有趣的事情是,包含的列表中只有3个Soundex值(如果忽略离群值'Kazzafi')

G310, k310, q310

现在,这里存在误报(“Godby”也是G310),但是通过结合有限的变音位命中,可以消除它们。

<?
$soundexMatch = array('G310','K310','Q310');
$metaphoneMatch = array('KTF','KTHF','FTF','KHTF','K0F');

$text = "This is a big glob of text about Mr. Gaddafi. Even using compound-Khadafy terms in here, then we might find Mr Qudhafi to be matched fairly well. For example even with apostrophes sprinkled randomly like in Kad'afi, you won't find false positives matched like godfrey, or godby, or even kabbadi";

$wordArray = preg_split('/[\s,.;-]+/',$text);
foreach ($wordArray as $item){
    $rate = in_array(soundex($item),$soundexMatch) + in_array(metaphone($item),$metaphoneMatch);
    if ($rate > 1){
        $matches[] = $item;
    }
}
$pattern = implode("|",$matches);
$text = preg_replace("/($pattern)/","<b>$1</b>",$text);
echo $text;
?>

稍作调整,再加上一些西里尔字母的音译,您将得到一个相当健壮的解决方案。

容易……谴责卡扎菲(为了规避风险| | |……它是自文档化的、可维护的,并且假设您的regexp引擎实际上编译正则表达式(而不是解释它们),它将编译到与更模糊的解决方案相同的DFA。

编写紧凑的正则表达式就像使用短变量名来加快程序的速度。只有当你的编译器是脑死亡的时候才有用。

(G|Gh|K|Kh|Q|Qh|Q|Qu)(a|au|e|u)(dh|zz|th|d|dd)(dh|th|a|ha|)(\x27|)(a|)(ff|f)(i|y)

当然不是最优化的版本,在音节上进行分割以最大化匹配,同时试图确保我们不会得到假阳性。

(服饰)+ (dasta) + \”?(得到)+ \ ' ?

在部分:

黑GQK铝 黑ahu铝+。 黑dtez铝+。 \”? 黑adhz铝+。 f那1,2 (i | y)

注:只是想试一试。

为什么不采用混合的方法呢?介于所有可能性列表和匹配太多的复杂正则表达式之间的东西。

Regex是关于模式匹配的,我不能在列表中看到所有变体的模式。试着这样做,还会发现像“Gazzafy”或“Quud’haffi”这样的东西,它们很可能不是一个常用的变体,也绝对不在列表上。

但我可以看到一些变异的模式,所以我得出了这个结论:

\b(?:Gheddafi|Gathafi|Kazzafi|Kad'afi|Qadhdhafi|Qadthafi|Qudhafi|Qu?athafi|[KG]h?add?h?aff?[iy]|Qad[dh]?afi)\b

在一开始,我列出了那些我看不到模式的,然后是一些有模式的变体。

请访问www.rubular.com