我正在尝试匹配一组特定的字符,但每个字符只有1个。
例如,如果集合为[abcd]
,我希望以任何顺序匹配包含这些确切字符的字符串。
abcd - true
bcad - true
abc - false (need all characters)
abbd - false
abcdd - false
据我所知,到目前为止还没有简单的方法可以通过RegEx实现这一目标,但没有足够的答案。
答案 0 :(得分:6)
我会考虑capturing并使用lookahead检查相同的字符是否未提前。
\b(?:([abcd])(?!\w*?\1)){4}\b
(?:
打开non capture group重复\b
匹配word boundary ([abcd])
捕获[abcd]
(?!\w*?\1)
检查所捕获的角色是否未提前任意数量的\w
{4}\b
4次,直到另一个字边界See demo at regex101(仅适用,如果您的正则表达式中有可用的前瞻)
答案 1 :(得分:1)
您可以对每个字符使用前瞻来断言char只在正则表达式中出现一次。
所以,例如对于您的输入字符ingredients
生成此正则表达式:
abcd
^ ^(?=[^a]*a[^a]*$)(?=[^b]*b[^b]*$)(?=[^c]*c[^c]*$)(?=[^d]*d[^d]*$)
将声明(?=[^a]*a[^a]*$)
仅在输入中出现一次。等等其他字符a
。
答案 2 :(得分:0)
您要解决的问题是检查字符串是否为“abcd”的排列。
您不希望在遇到的每个问题中都使用正则表达式。当您拥有模式时,它非常有用且功能强大。检查字符串是否是“abcd”的排列并不是真正的“模式”。
最好的方法是使用语言的力量,并根据可用的功能构建解决方案。
答案 3 :(得分:0)
使用grep只是一个不起眼的贡献:
grep -Px '[abcd]{4}' | grep -vP '(.).*\1'
答案 4 :(得分:0)