正则表达式匹配唯一字符的字符串

6

这是我的正则表达式:

((GO)( [A-Z])+)

我希望每个字母最多只出现一次,但不幸的是,它没有正常工作,因为输入如下:
GO A B C C

返回值应该为false,但实际上返回了true。


感谢您的快速回复。我决定使用@anubhava的解决方案。我需要字母之间有空格。 - Aleksander Mielczarek
3个回答

6

5

您的正则表达式是:

GO(?:([A-Z])(?!.*\1))+$
  • 匹配文字 GO,后跟:
  • 任何字符 A-Z,出现次数从零到无限次。
  • 对于每个遇到的字符进行断言,确保在下一个换行符 ($) 之前,该字符不会与任何 (.) 后续字符匹配。

最后一步的关键是使用零长度负向先行断言(?!.*\1)


你测试过正则表达式了吗?(有一个小错误,你可以在anubhavas的答案中找到它是什么)。 - Pshemo
不对,@Pshemo,你抓住我了 - 我那时是凭感觉说的。谢谢你指出来! - drew moore

1
您可以使用以下正则表达式:
^GO (?:([A-Z])(?!.*\1)\s*)*$

它将匹配以下任何内容:

  • GO<空格>开头
  • 仅包含字母([A-Z]),可以由任何空白字符序列分隔,但:
  • 以前从未出现过。

regex101上使用它!


样例匹配情况:

GO A B C
GO ABC
GO A B C G O

样例不匹配情况:

A B C
GO A A A

我不确定GO ABC是否应该作为匹配情况之一(只是根据 OP 的正则表达式和示例猜测)。 - Pshemo
说实话,我也不确定。然而,我通常根据规定的要求开发我的解决方案,而且该要求只是说“我希望每个字母最多只出现一次”;) - ccjmne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接