什么正则表达式可以允许分隔符,但前提是周围的组存在?

问题描述 投票:0回答:1

我需要设计一个正则表达式来匹配由分隔符分隔的 4 个部分(在本例中为

:
)。 4 个部分必须按顺序排列,每个部分之间必须有分隔符,但各个部分都是可选的。

这些应该全部匹配:

A
B
C
D
A:B
A:C
A:D
B:C
B:D
C:D
A:B:C
A:B:D
A:C:D
B:C:D
A:B:C:D

同时,这些不应该匹配。

A:    // cannot end with delimiter
:C    // cannot start with delimiter
ABC   // cannot omit delimiter
A:BC  // cannot omit delimiter
A::B  // cannot duplicate delimiter
...   // many other possible non-matches

我的问题是我不知道如何匹配分隔符。

  • 我尝试过
    ^(A)?:?(B)?$
    ,但随后它会匹配
    AB
  • 我尝试过
    ^(A:)?(B)?$
    ,但随后它会匹配
    A:
  • 我可以手动枚举所有 15 种匹配类型,但那是一团糟 (
    ^(A)|(B)|(C)|(D)|(A:B)|(A:C)...........$
    )。在实际的正则表达式中,
    A
    B
    等更复杂。
  • 我尝试了像这样的更简洁的枚举
    ^((A)|((A:)?((B)|((B:)?((C)|((C:)?(D)))))))$
    ,但对我来说它看起来仍然一团糟。如果我找不到更好的答案,我会选择这个选项。
regex
1个回答
0
投票

您可以将冒号设为可选,但使用单词边界要求在字母之间使用冒号:

^\b(?::?A)?(?::?\bB)?(?::?\bC)?(?::?\bD)?$

请参阅 regex101 的演示


或者您将所有字符设为可选并使用 lookahead 来验证格式:

^(?=\w(?::\w)*$)A?:?B?:?C?:?D?$

regex101 的另一个演示

\w
匹配单词字符)

© www.soinside.com 2019 - 2024. All rights reserved.