正则表达式:匹配打开/关闭字符与空格

时间:2010-03-18 14:33:48

标签: asp.net regex

我正在尝试完成一个正则表达式,根据它们的开始和结束字符拉出匹配,我得到的最接近的是

^(\[\[)[a-zA-Z.-_]+(\]\])

哪个匹配一个字符串,如“[[word1]]”,如果有多个匹配,则将我带回所有匹配项,问题是我希望它能找到可能存在空格的匹配项例如“[[word1 word2]]”,现在如果我在上面的模式中添加一个空格,这将会起作用但是这会弹出一个问题,它只会为我的整个字符串获得一个匹配,例如,如果我有一个字符串

"Hi [[Title]] [[Name]] [[surname]], How are you"

然后匹配将是[[Title]] [[Name]] [[surname]]而不是3个匹配[[Title]][[Name]][[surname]]。我敢肯定我只是在正则表达式中的一两个角落,但是我被困住了,我怎么能让它返回3场比赛。

由于

3 个答案:

答案 0 :(得分:4)

你需要使用?之类的方式让你的正则表达式非贪婪

^(\[\[)[a-zA-Z.-_ ]+?(\]\])

你的正则表达式中还有一个错误。你已经在char类中包含了-,认为它是一个文字连字符。但是char类中的-是一个元字符。因此它有效地匹配.(句点)和_(下划线)之间的所有字符。所以你需要将其转义为:

^(\[\[)[a-zA-Z.\-_ ]+?(\]\])

或者你可以把它放在正则表达式的其他地方,这样就不会在它的两边都有东西:

^(\[\[)[a-zA-Z._ -]+?(\]\])

^(\[\[)[-a-zA-Z._ ]+?(\]\])

答案 1 :(得分:1)

你需要关闭贪婪的匹配。请参阅以下不同语言的示例:

  1. asp.net
  2. java
  3. javascript

答案 2 :(得分:1)

您应该使用+?代替+。 没有问号的那个会尝试尽可能地匹配,而带有问号的那个尽量少。

另一种方法是使用[^\]]作为您的字符而不是[a-zA-Z.-_]。这样,匹配永远不会延伸到结束括号。