[英]How to match any combination of letters using regex?
如何以任意组合和不同长度匹配字母 a,b,c 一次,如下所示:
该表达式应匹配以下情况:
abc
bc
a
b
bca
但不应与这些匹配:
abz
aab
cc
x
使用正则表达式
\b(?!\w*(\w)\w*\1)[abc]+\b
您可以将此模式与任何集合和大小一起使用,只需将[abc]
替换为所需的集合...
示例:
(以上输出来自myregextester )
^(?=([^a]*a?[^a]*)$)(?=([^b]*b?[^b]*)$)(?=([^c]*c?[^c]*)$)[abc]{1,3}$
这适用于lookaheads 。
它以三种变体形式包含此模式: (?=([^a]*a?[^a]*)$)
它说:从这里(开始)到结束最多需要一个a
。
^([abc])((?!\1)([abc])((?!\1)(?!\3)[abc])?)?$
只是为了完善集合:
^(?:([abc])(?!.*\1))+$
想要处理更大的字符集? 没问题:
^(?:([abcdefgh])(?!.*\1))+$
编辑:显然我误读了这个问题; 您不是在验证像"abc"
和"ba"
这样的单个字符串,而是试图在更大的字符串中找到全字匹配。 这是我将如何做到的:
\b(?:([abc])(?![abc]*\1))+\b
棘手的部分是确保前瞻不会超出当前匹配的单词的末尾。 例如,如果我离开先行的(?!.*\\1)
它会失败,以匹配abc
在abc za
因为先行错误地将标志a
以za
为一体的重复a
在abc
。 允许前瞻只查看有效字符 ( [abc]*
) 使其保持足够短的皮带。 如果当前单词中存在无效字符,则无论如何发现它们不是前瞻的工作。
(感谢Honest Abe让我重新注意到这一点。)
^(?=(.*a.*)?$)(?=(.*b.*)?$)(?=(.*c.*)?$)[abc]{,3}$
锚定前瞻将每个字母的出现次数限制为一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.