我的问题:
我需要在字符串的开头匹配一些标志,这些标志是可选的,并且可以是非特定的顺序。
我得到了什么:
让我说我的旗帜是'+',' - '和'0'。如果我使用
[\-\+0]*
标志可以是非特定顺序,但它们会多次匹配。如果我使用
\-?\+?0?
标志只匹配一次,但具有给定的顺序。我想我需要以某种方式使用外观断言,但我不知道如何。
更新
这就是我想要匹配的(几个例子):
但不应重复标志:
答案 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]+
构建所有标志,然后遍历字符串中的字符,将它们添加到集合(唯一元素)。如果元素已经在集合中,则验证失败。