我刚刚开始了解正则表达式,但是在阅读了很多内容(并且学到了很多东西)之后,我仍然无法找到解决这个问题的好方法。
让我说清楚,我知道不使用正则表达式可能会更好地解决这个特定问题,但为了简洁起见,我只想说我需要使用正则表达式(相信我,我知道有更好的方法来解决这个问题)。
这就是问题所在。我得到了一个大文件,每行正好有 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"
这工作正常,性能是可以接受的。令我困扰的是,我必须基于 生成它$line
,我宁愿让它不知道具体参数是什么。此外,如果稍后修改代码以匹配 3 个或更多字符,或者如果每行的大小从 4 增长到 16,则此解决方案的扩展性不佳。
感觉就像我忽略了一些非常简单的事情。似乎这可能是一个重复的问题,但我看过的其他问题似乎都没有真正解决这个特定问题。
提前致谢!
更新:
似乎正则表达式答案的规范是让 SO 用户简单地发布一个正则表达式并说“这应该适合你”。
我认为这是一个半途而废的答案。我真的很想了解正则表达式,所以如果您可以在答案中包含对为什么该正则表达式的彻底(合理)解释:
- A. 作品
- B. 是最有效的(我觉得可以对主题字符串做出足够多的假设,可以进行相当多的优化)。
当然,如果您给出一个有效的答案,并且没有其他人*用* 解决方案发布答案,我会将其标记为答案 :)
更新 2:
谢谢大家的精彩回复,很多有用的信息,你们中的很多人都有有效的解决方案。我选择了我所做的答案,因为在运行性能测试之后,它是最好的解决方案,平均运行时间与其他解决方案相同。
我赞成这个答案的原因:
- 给定的正则表达式为更长的行提供了出色的可伸缩性
- 正则表达式看起来更干净,对于像我这样的凡人来说更容易解释。
但是,很多功劳归功于以下答案,因为他们非常彻底地解释了为什么他们的解决方案是最好的。如果您遇到这个问题是因为这是您想要弄清楚的问题,请给他们全部阅读,这对我有很大帮助。