如何确保String在正则表达式中始终后跟一个字符?

时间:2014-08-11 16:00:54

标签: regex

以下是一些在我的场景中有效的示例:

apple  
apple,banana  
apple,banana,mango  

但这些都是无效的:

apple,  
,apple  
apple,banana,  

这是我的正则表达式:

(apple|banana|mango)(,(apple|banana|mango))*

我可以看到问题出在(,(apple|banana|mango))*,因为它意味着,和苹果,香蕉和芒果的出现次数。我需要确保如果有逗号,则后跟水果名称。

我不是在这里验证重复的水果名称,即apple,apple,banana,apple是有效的。

那我怎么能这样做呢?

4 个答案:

答案 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)

如果您的正则表达式平台支持外观,那么您可以使用此正则表达式:

(?<!^,)(apple|banana|mango)(?!.*?,$)

RegEx Demo

答案 2 :(得分:0)

如果你的引擎支持 lookbehinds ,那么我建议使用它:

^(?<!,)((apple|banana|mango),?)+(?<!,)$

Demo

如果没有,您可以使用 前瞻 来实现它:

^(?=[,]*?)(?!.*,$)((apple|banana|mango),?)+$

Demo

答案 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