我试图编写一个匹配正好三个字符组的正则表达式,这个字符集至少在文本中重复出现一次。
我想出的是这个简单的正则表达式:(.{3}).*\g1
,使用\ g(全局)和\ s(点也匹配换行符)标志。然而,它显然是错误的,因为它只找到了我希望捕获的一部分组。知道怎样才能改进它?以下是示例输入https://regex101.com/r/Cuiva1/2的链接
编辑:以下是我希望按照评论中的要求捕获的完整列表:GLT
,VIW
,IWK
,KTL
,{{1 }},GLT
,LTK
,LIS
,KTX
,TXK
,XDL
答案 0 :(得分:0)
如果您的输入始终是大写字符的多个三元组,而您只是在寻找重复的字符,那么您需要更复杂的东西以避免回溯到之前的三元组:
/(?>[^A-Z]*+([A-Z]{3}))(?=(?:[^A-Z]*+[A-Z]{3})*?\1)|(?>[^A-Z]*+[A-Z]{3})/g
索引1
的匹配将保留您想要的内容。如果您的字符串格式不正确(即在重复模式之间可能包含任何长度字符串,那么您可以使用更简单的模式,但是您将获得完全不一致的结果并错过一些匹配。
我重读了你想要的输出,你不会用正则表达式实现这个目标。 VIW
和IWK
重叠,不会在单个preg_match_all()
中发挥作用。只需使用字符串函数。