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

问题描述 投票:-1回答:1

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

  • S =“你好夜斧axbxbxx舞会......等等......”
  • 字符集1 = [abcdexy]
  • 字符集2 = [mnrpo]

我需要只得到一个匹配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()测试?

php regex preg-match
1个回答
0
投票

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

代码:(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

上述方法不是“绑定感知”,因此如果您有两个值或更多值共享最大长度,则输出中只能获得一个值。我认为你需要构建一些额外的逻辑来处理这些边缘情况,如:

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

我不打算编写这些解决方案扩展的代码,因为我不想放下兔子洞。

© www.soinside.com 2019 - 2024. All rights reserved.