以下是一些在我的场景中有效的示例:
apple
apple,banana
apple,banana,mango
但这些都是无效的:
apple,
,apple
apple,banana,
这是我的正则表达式:
(apple|banana|mango)(,(apple|banana|mango))*
我可以看到问题出在(,(apple|banana|mango))*
,因为它意味着,
和苹果,香蕉和芒果的出现次数。我需要确保如果有逗号,则后跟水果名称。
我不是在这里验证重复的水果名称,即apple,apple,banana,apple
是有效的。
那我怎么能这样做呢?
答案 0 :(得分:2)
如果您需要确保匹配项周围没有前导或尾随字符,则需要使用start(^
)和end($
)个锚点,如下所示:
^(apple|banana|mango)(,(apple|banana|mango))*$
或者为了简单起见,如果您所选择的平台支持,您可以使用负面的lookbehind((?<!…)
):
^((^|(?<!^),)(apple|banana|mango))+$
或者是否定前瞻((?!…)
):
^((apple|banana|mango)(,(?!$)|$))+$
自从你提出 if 以来你想确保你的模式与具有重复水果名称的字符串不匹配时,你可以使用负向前瞻和反向引用(\n
),像这样:
^(((?<!^),)?(apple|banana|mango)(?!.*\3))+$
这将匹配apple,banana
但不匹配apple,banana,apple
。
答案 1 :(得分:0)
答案 2 :(得分:0)
如果你的引擎支持 lookbehinds ,那么我建议使用它:
^(?<!,)((apple|banana|mango),?)+(?<!,)$
如果没有,您可以使用 前瞻 来实现它:
^(?=[,]*?)(?!.*,$)((apple|banana|mango),?)+$
答案 3 :(得分:0)
编辑 - 使用逗号分隔符问题,您可以立即验证整个字符串以确保 这样的开头,中间和结尾都没有悬空的逗号 -
# ^[^,]+(?:,[^,]+)*$
^
[^,]+
(?: , [^,]+ )*
$
除了逗号分隔符问题,最小公分母就是这样的
# ^(?si)[a-z].*(?<=[a-z])$
^ # BOS
(?si) # Modifiers s = Dot-All, i = Case Insensitive
[a-z] # single required char, a-z case insensitive
.* # optional many any chars
(?<= [a-z] ) # before the end, single char a-z case insensitive
$ # EOS