考虑以下数组元素
1.benclinton
2.clintonharry
3.harryben
4.benwill
5.jasonsmith
6.smithclinton
假设模式列表为 ben,harry,clinton ,那么我应该得到的结果是
1.benclinton
2.clintonharry
3.harryben
因此,基本上,结果应包含仅包含模式列表中单词的字符串。顺序并不重要
此外,每个字符串的单词数不得超过两个。即本史密斯永远都不会这样。
因为我所有的字符串都在数组中,所以我想到了在php中使用preg_grep来执行此操作,但是我为此而构筑了正确的正则表达式而感到震惊。
哪些正则表达式可以实现这一目标?除了正则表达式匹配之外,还有其他有效的方法可以做到吗?
谢谢!
答案 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
)
这要求至少两个名称(甚至是相同的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)
没有正则表达式。请使用nameOfBestCustomer
和def 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 + ".")
purrr::map2