2014-12-03 72 views
0

我能串[ORG] someText与此正则表达式匹配:/^\[(ORG|PER|LOC)]\s[^\W_]+$/正则表达式匹配这种重复模式?

var selectedText = "[ORG] dd"; 
 

 
if (selectedText.match(/^\[(ORG|PER|LOC)]\s[^\W_]+$/)) { 
 
    console.log("working"); 
 
}

输入文本可在标签,其后任何文字东西。


现在我有文本为:[ORG] Lorem [ORG] ipsum(用空格结束)

我试图通过分组图案,并用+(一个或以上次数)重复以匹配这一点。

这样:/^(\[(ORG|PER|LOC)]\s[^\W_]\s)+$/

但是它不匹配。

基本上,它应该符合:

[tag] sometext 

[tag] sometext [tag2] someOtherText // ending with or without a space 

所以,总的来说,它需要匹配的a tag followed by a space and a word模式。

它不应该搭配什么:

[tag] sometext someMoreText 

[tag] sometext someMoreText [tag9] 

[tag] [tag9] sometext someMoreText 
+1

任何特别的原因,你为什么不直接使用全局标志'/ \ [(ORG | PER | LOC)\ S [^ \ W _] + $/g'? – Tomalak 2014-12-03 07:53:17

+0

然后你必须删除锚,但无论如何这是一个好点。 – raina77ow 2014-12-03 07:53:44

+0

@Tomalak我无法得到它的工作。 :(http://jsfiddle.net/rdesai/27vfd38w/4/ – 2014-12-03 07:55:41

回答

1

它应该是:

/^(\[(ORG|PER|LOC)]\s[^\W_]+(?:\s|$))+$/ 

...也就是说,增加一个空格和结束线的边界之间的交替(对于字符串中的最后一个模式不以空格结束)。

Demo。另外请注意,如果您只需检查字符串是否与该模式匹配,String#match方法实际上是一种矫枉过正的方法;相反,你应该RegExp#text

var tagsPattern = /^(\[(ORG|PER|LOC)]\s[^\W_]+(\s|$))+$/; 
if (tagsPattern.test(str)) { 
    // matches 
}