正则表达式用于获取仅包含模式列表中单词的字符串?

时间:2019-03-10 04:09:43

标签: php regex preg-match preg-match-all preg-grep

考虑以下数组元素

 1.benclinton
 2.clintonharry
 3.harryben
 4.benwill
 5.jasonsmith
 6.smithclinton

假设模式列表为 ben,harry,clinton ,那么我应该得到的结果是

1.benclinton  
2.clintonharry  
3.harryben

因此,基本上,结果应包含仅包含模式列表中单词的字符串。顺序并不重要

此外,每个字符串的单词数不得超过两个。即本史密斯永远都不会这样。

因为我所有的字符串都在数组中,所以我想到了在php中使用preg_grep来执行此操作,但是我为此而构筑了正确的正则表达式而感到震惊。

哪些正则表达式可以实现这一目标?除了正则表达式匹配之外,还有其他有效的方法可以做到吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

类似这样的东西

$names_list = ['benclinton','clintonharry','harryben','benwill','jasonsmith','smithclinton'];
$names = ['ben','harry','clinton'];  

$matches = preg_grep('/('.implode('|',$names).')(?1)/', $names_list);
//-  /(ben|harry|clinton)(?1)/  -- (?1) = recurse capture group 1 

print_r($matches);

输出

Array
(
    [0] => benclinton
    [1] => clintonharry
    [2] => harryben
)

Sandbox

这要求至少两个名称(甚至是相同的2x)匹配。但这是给定的,否则一切都会匹配。

如果要格外小心,如果$names可以包含对正则表达式很重要的内容,例如+*\等,则可以添加此内容

$matches = preg_grep('/('.implode('|',array_map(function($name){return preg_quote($name,'/');},$names)).')(?1)/', $names_list);

答案 1 :(得分:0)

您似乎想要匹配两个关键字的精确组合的数组元素。对于正则表达式方法,我们可以尝试获取keyords向量的叉积,然后生成替代。然后,我们可以对您的输入数组使用preg_grep来查找所有匹配的元素。

$array = array("benclinton", "clintonharry", "harryben", "benwill", "jasonsmith", "smithclinton");
$input = array("ben", "harry", "clinton");
$regex = "";
foreach ($input as $term1)  {
    foreach ($input as $term2)  {
        if ($regex != "") $regex .= "|";
        $regex .= $term1.$term2;
    }
}
$regex = "/^(" . $regex . ")$/";
$matches = preg_grep($regex, $array);
print_r($matches);

Array
(
    [0] => benclinton
    [1] => clintonharry
    [2] => harryben
)

以下是上述脚本生成的正则表达式替换:

(benben|benharry|benclinton|harryben|harryharry|harryclinton|clintonben|
    clintonharry|clintonclinton)

答案 2 :(得分:0)

没有正则表达式。请使用nameOfBestCustomerdef nameOfBestCustomer(sales, customers) : #@param: sales and customers lists #@return: none bestCustomer = "" salesMax = 0 salesMax = max(sales) for i in range(len(customers)): if sales[i] == salesMax: print("The best customer of the day was " + customers[i] + ".") print("They spent $%.2f" % salesMax + ".")

  1. 具有匹配的第二个数组的过滤器数组,其计数大于1

Sandbox

purrr::map2