PHP Regex检查两个字符串是否共享两个常用字符

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了PHP Regex检查两个字符串是否共享两个常用字符脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我只是认识正则表达式,但经过相当多的阅读(并且学得很多)之后,我仍然无法找出一个很好的解决方案.

让我清楚一点,我明白,这个特殊的问题可能会更好地解决不使用正则表达式,但是为了简洁起见,我只是说我需要使用正则表达式(相信我,我知道有更好的方法解决这个问题).

这是问题.我给了一个文件,每行的长度是4个字符.

这是一个定义“有效”行的正则表达式:

"/^[AB][CD][EF][GH]$/m"

在英语中,每一行都有位置0的A或B,位置1的C或D,位置2的E或F,位置3的G或H都可以.我可以假设每一行将正好是4个字符长.

我想要做的是给出其中一行,匹配包含2个或更多常见字符的所有其他行.

以下示例假定:

> $line始终是一个有效的格式
> BigFileOfLines.txt只包含有效行

例:

// Matches all other lines in string that share 2 or more characters in common
// wITh "$line"
function findMatchingLines($line,$subject) {
    $regex = "magic regex I'm looking for here";
    $matchingLines = array();
    preg_match_all($regex,$subject,$matchingLines);
    return $matchingLines;
}

// Example usage
$fileContents = file_get_contents("BigFileOfLines.txt");
$matchingLines = findMatchingLines("ACFG",$fileContents);

/*
 * Desired return value (Note: this is an example set,there 
 * Could be more or less than this)
 * 
 * BCEG
 * ADFG
 * BCFG
 * BDFG
*/

我知道这样做的一个方法是像下面的正则表达式(下面的正则表达式只适用于“ACFG”:

“/^(?:AC.{2}|.CF.|.{2}FG|A.F.|A.{2}G|.C.G)$/m”

这工作正常,性能可以接受.令我困扰的是,我必须根据$行生成这个,我宁可不知道具体的参数是什么.此外,如果稍后的代码修改为匹配3个或更多个字符,或者如果每行的大小从4增加到16,则此解决方案不会很好地扩展.

只是觉得有一些非常简单的东西,我忽略了.也似乎这可能是一个重复的问题,但我看过的其他问题似乎都没有解决这个特殊的问题.

提前致谢!

更新:

似乎正则表达式的答案是SO用户简单地发布一个正则表达式,并说“这应该适合你”.

我认为这是一个途的答案.我真的想了解正则表达式,所以如果你可以在你的答案中包含一个彻底的(内在的理由)解释为什么那个正则表达式:

A.工作
B.是最有效的(我认为有足够数量的假设可以对主题字符串做出相当大的优化).

当然,如果你给出一个有效的答案,而没有人发表答案* *解决方案,我会把它标记为答案:)

更新2:

感谢大家的反响,很多有用的信息,还有很多有效的解决方案.我选择了我所做的答案,因为在运行性能测试之后,它是最好的解决方案,平均与其他解决方案相同的运行时间.

我赞成这个答案的原因是:

给定的正则表达式为更长的行提供了极好的可扩展性
正则表达式看起来更清洁,而且像我自己这样的凡人更容易理解.

然而,很多信用也是为了解释为什么他们的解决方案是最好的,以下答案也是非常彻底的.如果你遇到这个问题,因为它是你想要弄清楚的东西,请给他们一个阅读,帮助我极大地.

为什么你不使用这个正则表达式$regex =“/.*[$line].*[$line].*/m”;?

对于您的示例,转换为$regex =“/.*[ACFG].*[ACFG].*/m”;

脚本宝典总结

以上是脚本宝典为你收集整理的PHP Regex检查两个字符串是否共享两个常用字符全部内容,希望文章能够帮你解决PHP Regex检查两个字符串是否共享两个常用字符所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。