仅使用正则表达式匹配最长的单词

Matching a longest word using Regex only

我需要使用正则表达式匹配给定字符串的最长单词: 例如给定字符串

我只需要得到一个匹配 2 个约束的单词,所有单词应该只包含一组中的字符并且选择的单词应该是最长的,我尝试使用 php 正则表达式来解决这个问题,例如:

preg_match("/\b[abcdexy]+/",$s, $match1);
preg_match("/\b[mnrpo]+/",$s, $match2);
if(strlen($match1[0]) > strlen($match2[0]))
{
  //output match1[0];
}
else
{
 //output match2[0]
}

预期的输出应该是 axbxbxx,因为它只包含第 1 组中的字符,并且它是属于两个集合之一的单词之间最长的。

我的问题是,我是否可以只使用正则表达式而不需要 strlen() 测试来完成这项工作?

您可以编写一个使用管道匹配两个字符范围的正则表达式,然后按长度降序对匹配的值进行排序并访问第一个元素的值。

代码:(Demo)

$string='hello proxy night pom-pom-mop axe prom etc decayed';
if (preg_match_all('~\b(?:[a-exy]+|[m-pr]+)\b~', $string, $out)) {
    usort($out[0], function($a, $b) {return strlen($b) - strlen($a);});  // or spaceship operator if you like
    echo $out[0][0];
} else {
    echo "no matches";
}

输出:

decayed

上述方法不是"tie-aware",因此如果您有两个或多个共享最长长度的值,您将只会在输出中得到一个值。我认为您需要构建一些额外的逻辑来处理这些边缘情况,例如:

  • 输出所有最大长度值或
  • 设置次要标准以打破长度上的联系

我不会费心编写这些解决方案扩展,因为我不想陷入困境。