让我清楚一点,我明白,这个特殊的问题可能会更好地解决不使用正则表达式,但是为了简洁起见,我只是说我需要使用正则表达式(相信我,我知道有更好的方法来解决这个问题).
这是问题.我给了一个大文件,每行的长度是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 =“/.*[ACFG].*[ACFG].*/m”;