2016-10-14 71 views
-2

我需要确保每次出现name后总是跟着一个特定模式,例如:[a-zA-Z]。正则表达式只有在没有出现此模式后没有出现名称的情况下才能匹配。所以下面的字符串不能匹配,因为Ch%ristoph如何确保特定模式总是遵循特定模式?

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

需要明确的是:我需要这个做完全用正则表达式不使用REG前定义或任何其他代码。 (我知道有关环视和高级正则表达式,但无法找到解决这个问题的办法。)

+0

要做这样的事情,你可以使用前视/后视,统称为lookaround。 http://www.regular-expressions.info/lookaround.html – Zack

+0

也许我误解了你的要求。您的情况是否在整个输入中合格/不合格?还是你想捕捉个人比赛?另外,您的示例输入在第二个和第三个大括号之间缺少逗号,还是您需要考虑可能缺失的逗号? – Zack

+0

缺少的逗号是一个错字。我需要通过或失败整个输入。这基本上是一个测试。我不需要捕捉任何东西。我使用的正则表达式要复杂得多。我试图将问题降低到所需的最低复杂度。 – mrplow

回答

0

这个正则表达式将匹配你的确切模式,它只需要在-z或者-z之后的name:部分。

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

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

如果要求一个合格/不合格的整个输入,那么你可以使用下面的

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

,并确保有一个比赛,那一场比赛的长度是一样的输入长度。

+0

这不起作用,并且不能满足作为唯一的解决方案的要求。 – mrplow

+0

“不满足作为注册唯一解决方案的要求”,在*之后添加*我已经发布了我的答案,顺便说一下。即使我的编辑在添加之前发布,它也会“消耗完整的字符串”。 – Zack

+0

原始问题只提到正则表达式,正则表达式是唯一的标签。我认为很明显,我需要注册唯一的解决方案。你的回答指出我需要确保字符串长度是相等的。这需要额外的代码。另外,您的正则表达式对我无效请参阅:https://regex101.com/r/8228Xu/1克里斯托弗包含一个不合法的字符,但表达式无论如何都匹配。 – mrplow

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')) 
 
}

+0

嗯...听起来像功课。 –

+0

我做了一个编辑,试试看。 –

+0

老兄,for循环仅仅是一个用法的例子......你不必循环使用正则表达式。我应用于有效字符串和无效字符串时,显示正则表达式的结果。 –

-1

我找到了答案自己:

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

一般来说:让α(这里name:)是始终通过图案β之后(这里[a-zA-Z])模式。让它成为一个重复的结构中的分隔符,并且它本身被大括号分隔。让ɣ是结构(这里age:\d+)内的其他图案然后正则表达式是:

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

我认为这里的关键是要消耗完整字符串。以前的答案并非如此。

+0

“我认为这里的关键是消耗完整的字符串,而以前的答案不是这种情况。”除了我昨天编辑的答案,但很酷,我很高兴你找到了适合你的东西。 –

+0

你的回答并不回答这个问题。我的确如此。你为什么低调? – mrplow

+0

如果你的意思是我的答案不适合你的家庭作业,那很好。但是,如果你在我的答案中运行片段,你会发现他们完全按照你的要求做了。 –