从一组字符中精确匹配其中一个

时间:2016-03-14 14:15:30

标签: regex

我正在尝试匹配一组特定的字符,但每个字符只有1个。

例如,如果集合为[abcd],我希望以任何顺序匹配包含这些确切字符的字符串。

abcd  - true
bcad  - true
abc   - false (need all characters)
abbd  - false
abcdd - false

据我所知,到目前为止还没有简单的方法可以通过RegEx实现这一目标,但没有足够的答案。

5 个答案:

答案 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

RegEx Demo

^ ^(?=[^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 [abcd]
  • 的序列号
  • 并删除包含重复的行

答案 4 :(得分:0)

请参阅bobble bubble's excellent answer了解真正的正则表达式解决方案(有时是必要的)。这个答案使用排序和字符串相等而不是单个正则表达式:

[^\)]