在字符串开头匹配标志(可选,非特定顺序)

时间:2014-07-29 07:00:28

标签: regex regex-lookarounds

我的问题:

我需要在字符串的开头匹配一些标志,这些标志是可选的,并且可以是非特定的顺序。

我得到了什么:

让我说我的旗帜是'+',' - '和'0'。如果我使用

[\-\+0]*

标志可以是非特定顺序,但它们会多次匹配。如果我使用

\-?\+?0?

标志只匹配一次,但具有给定的顺序。我想我需要以某种方式使用外观断言,但我不知道如何。

更新

这就是我想要匹配的(几个例子):

  • - + 0
  • 0 -
  • +
  • -
  • 或者根本没有

但不应重复标志:

  • - +
  • 00 -

1 个答案:

答案 0 :(得分:0)

任意顺序的可选标志,不重用标志

我们将从纯正则表达式解决方案开始。在底部,我们将讨论其他选项。

在模式的开头使用它:

^([-+0]?)(?!.?\1)(?:([-+0])(?!\2))?[-+0]?(?![-+0])

the regex demo 中查看匹配和失败的内容。

使用自由间距正则表达式更具可读性:

(?x)             # free-spacing mode
^                # beginning of string
([-+0]?)         # capture optional flag to Group 1
(?!.?\1)         # check that chars 2 and 3 don't repeat Group 1

(?:              # optional non-capture group
   ([-+0])          # Group 2: match flag
   (?!\2)           # check that the next char is not the same
)?               # end group

[-+0]?           # match optional flag

(?![-+0])        # check that the next char is not a flag

<强>解释

  • ^锚点断言我们位于字符串的开头
  • ([-+0]?)(?!.?\1)捕获组1的可选标志,否定前瞻断言以下两个字符都不是第1组匹配的字符
  • (?:([-+0])(?!\2))?此可选捕获组包含捕获第二个标记的第2组,以及断言以下字符不是第2组匹配的字符的否定前瞻
  • [-+0]?可选地匹配第三个标志
  • (?![-+0])断言下一个字符不是标志

其他选项

单步执行操作很笨重,尤其是在您的要求发生变化时。另一种选择是使用^[-+0]+构建所有标志,然后遍历字符串中的字符,将它们添加到集合(唯一元素)。如果元素已经在集合中,则验证失败。