2016-03-08 38 views
-4

组值(a|b|c)什么是正则表达式会给我这些输出这些语句:如何检查组中具有不同值的语句?

a (True) 
a,b (True) 
b,c (True) 
b,c,a (True) 

a, (false) -no value after ',' 
a,a (false) -Repeated values 
b,b (false) -Repeated values 
+1

您的问题不清楚,请澄清一下。 – Maroun

+0

@WiktorStribiżew这将匹配a,a和b.b,不是吗? –

+0

@ChrisLear:当然,前瞻是必要的。 –

回答

2

这里是一个正则表达式,用于防止重复项尾随逗号。

/^(?:([abc]),(?!.*\1))*([abc])$/gm 

它测试包含字符后跟一个逗号一个可选基。在组内 - 使用负向预测来确保相同的字符不会在线上自行重复。这个组可能重复任何次数。最后测试最终字符(不可选)。

Example regex101 here

问候

编辑:

在回答在评论一个问题 - 这里是你如何可以做同样的代币/词:

^(?:(cat|dog|rat),(?!.*\1))*(cat|dog|rat)$ 

regex101 example

它基本上是相同的正则表达式,但使用替代字符类的替代字。

+0

'/ ^(?:(:?,?([abc]))(?!。* \ 1))* $/gm'稍微短一点,我认为其他类似。 –

+0

@ChrisLear一个逗号,但我猜不是这样 – ClasG

+0

我真的很喜欢改变它搜索的字母的容易程度 – 4castle

0

你想找到在中集集团昏迷sperated列表{A,B,C},但你不需要任何额外的尾随昏迷。我想你也不想缺少元素(连续的昏迷)。

我提出这样的:

^([a|b|c],)*[a|b|b]$ 

,并提出一点解释:

  • ,第一部分([A-Za-z]+,)*搜索每个字母元素跟一个逗号。。可以有任何数量的这些元素。这些是n个元素列表中的1,2,... n-1个元素。

  • 然后这最后部分[a|b|c]寻找最后元素。

  • 整个字符串被^[stuff]$包围,从而强制正则表达式匹配整个输入字符串,从开始到结束。

试试吧here。 (我不隶属于这个网站)

希望这对我有所帮助。

+0

只是播种,你不想重复。运气不好,我不认为这是可能的。我建议使用上面的方法,然后扫描一次'。* a。*'然后扫描'。* b。*',最后扫描'。* c。*'并请求最后3次扫描的匹配次数为< 1 –

+0

这匹配重复。不正确 – 4castle

+0

,但这会给我一个重复的阿尔法这样的,a或b,b :( –

-1

正则表达式不是解决此问题的唯一方法。

如果您想了解如何在没有正则表达式的情况下执行此操作,以下是一段JavaScript代码,演示了如何执行此操作。如果你想看到它与ClasG的正则表达式的完整演示,here's a cool little fiddle I made

var regexReplacement = function(input) { 
    var acceptableStrings = ["a", "b", "c"]; 
    var arr = input.split(","); 
    if (arr.indexOf("") == -1 && (new Set(arr)).size == arr.length) { 
    return arr.every(function(val) { 
     return acceptableStrings.some(function(acceptable) { 
     return val === acceptable; 
     }); 
    }); 
    } else { 
    return false; 
    } 
} 
+0

如果你是好奇的是,我发现我的函数平均在* 0.2141 * ms左右,而正则表达式平均在* 0.2134 ms *左右。 – 4castle

+0

我真的不希望这比使用正则表达式更好或更差,我只是为了彻底而给出一个替代方案。 – 4castle

+0

非常感谢我的朋友 –

相关问题