如何使用正则表达式匹配顺序任意、含冒号的字符组合?
如何用正则匹配含任意顺序字符和任意数量冒号的字符串
嘿,这个问题很实用!我来帮你拆解两种常见的场景,你可以根据自己的实际需求选:
场景1:匹配由「允许的字符+任意数量冒号」组成的连续字符串
如果你的需求是找出所有连续的、由字母(大小写)、问号和冒号组成的片段(就像你例子里的YK:kd?和JKD:Jdj:SL?),那直接用字符类+量词就能搞定:
[A-Za-z?:]+
解释:
[A-Za-z?:]:定义了允许出现的字符范围——大小写字母、问号和冒号,这些字符可以以任意顺序出现+:表示匹配1个或多个上述字符,刚好覆盖你例子里的连续片段
如果还需要允许其他字符(比如数字),直接加到字符类里就行,比如[A-Za-z0-9?:]+。
场景2:匹配「包含指定非冒号字符+任意数量冒号」的字符串(顺序任意)
如果你是想找必须包含某几个特定字符(比如Y、K、k、d、?),同时可以有任意数量冒号,字符顺序完全不限的字符串,那就要用到正向预查来确保所有指定字符都存在:
比如要匹配包含Y、K、k、d、?,且可以有任意数量冒号的字符串,正则可以这么写:
^(?=.*Y)(?=.*K)(?=.*k)(?=.*d)(?=.*\?)[A-Za-z?:]+$
解释:
^和$:表示匹配整个字符串(如果是找片段可以去掉)(?=.*X):正向预查,确保字符串里存在字符X(这里的X依次替换为你需要的每个指定字符)[A-Za-z?:]+:和场景1一样,限定字符串只能由允许的字符组成- 注意:问号
?在正则里是特殊字符,所以要转义成\?
比如这个正则会匹配YK:kd?、k:dY?K、:Y:K:d:k?这类符合要求的字符串。
小提示
- 如果你的需求是忽略大小写,可以在正则末尾加忽略大小写标志(不同语言里写法不同,比如JavaScript里是
/[A-Za-z?:]+/i,Python里是re.compile(r'[A-Za-z?:]+', re.I)) - 如果冒号可以出现在开头或结尾,上面的正则都能覆盖,因为字符类里包含了冒号
内容的提问来源于stack exchange,提问作者Bob




