如何确保特定模式始终遵循特定模式?

时间:2016-10-14 19:26:53

标签: regex

我需要确保name的每次出现都始终跟一个特定的模式,例如:[a-zA-Z]。只有在没有出现名称后面没有此模式的情况下,正则表达式才必须匹配。因此,由于Ch%ristoph,以下字符串不能匹配。

{name:Anton,age:10}{name:Bert,age:20}{name:Ch%ristoph,age:30}

要明确:我需要完成完全使用正则表达式而不使用reg ex定义或任何其他代码。 (我知道环顾四周和高级正则表达式,但无法找到解决此问题的方法。)

3 个答案:

答案 0 :(得分:1)

如果您反转条件,您可以轻松检查字符串无效(即匹配无效条件):

var strings = ['{name:Anton,age:10},{name:Bert,age:20},{name:Ch%ristoph,age:30}','{name:Anton,age:10},{name:Bert,age:20}{name:Christoph,age:30}'];
for(var i=0; i<strings.length; i++){
  var match = strings[i].match(/[{,][\s]*name:[a-z]*[^},a-z]/i);
  console.log(strings[i]+' is '+(match==null?'valid':'invalid'))
}

如果你真的需要一个只传递/失败字符串的正则表达式解决方案,请尝试这样的事情:

var strings = ['{name:Anton,age:10},{name:Bert,age:20},{name:Ch%ristoph,age:30}','{name:Anton,age:10},{name:Bert,age:20}{name:Christoph,age:30}'];
for(var i=0; i<strings.length; i++){
  var match = strings[i].match(/^({name:[a-z]+,[^}]+},?)+$/gi);
  console.log(strings[i]+' '+(match==null?'does not match':'matches'))
}

答案 1 :(得分:0)

此正则表达式将匹配您的确切模式,name:部分后只需要a-z或A-Z。

name:[a-zA-Z]+,age:[0-9]+

你可以在这里测试一下。 http://regexr.com/3eell

如果要求是整个输入的通过/失败,那么您可以使用以下

({name:[a-zA-Z]+,age:[0-9]+},?)+

确保有一个匹配,并且一个匹配的长度与您的输入长度相同。

答案 2 :(得分:-1)

我自己找到了答案:

^(?:{name:[a-zA-Z]+?,age:\d+})+$

一般来说:设α(这里name:)是模式β总是要遵循的模式(这里是[a-zA-Z])。让我们成为一个重复的结构中的分隔符,它本身由花括号分隔。让ɣ成为该结构中的其他模式(这里是age:\d+)然后正则表达式将是:

^(:{αβ+ ?,ɣ})+ $

我认为这里的关键是使用完整的字符串。以前的答案不是这种情况。