我正在尝试完成一个正则表达式,根据它们的开始和结束字符拉出匹配,我得到的最接近的是
^(\[\[)[a-zA-Z.-_]+(\]\])
哪个匹配一个字符串,如“[[word1]]”,如果有多个匹配,则将我带回所有匹配项,问题是我希望它能找到可能存在空格的匹配项例如“[[word1 word2]]”,现在如果我在上面的模式中添加一个空格,这将会起作用但是这会弹出一个问题,它只会为我的整个字符串获得一个匹配,例如,如果我有一个字符串
"Hi [[Title]] [[Name]] [[surname]], How are you"
然后匹配将是[[Title]] [[Name]] [[surname]]
而不是3个匹配[[Title]]
,[[Name]]
,[[surname]]
。我敢肯定我只是在正则表达式中的一两个角落,但是我被困住了,我怎么能让它返回3场比赛。
由于
答案 0 :(得分:4)
你需要使用?
之类的方式让你的正则表达式非贪婪:
^(\[\[)[a-zA-Z.-_ ]+?(\]\])
你的正则表达式中还有一个错误。你已经在char类中包含了-
,认为它是一个文字连字符。但是char类中的-
是一个元字符。因此它有效地匹配.
(句点)和_
(下划线)之间的所有字符。所以你需要将其转义为:
^(\[\[)[a-zA-Z.\-_ ]+?(\]\])
或者你可以把它放在正则表达式的其他地方,这样就不会在它的两边都有东西:
^(\[\[)[a-zA-Z._ -]+?(\]\])
或
^(\[\[)[-a-zA-Z._ ]+?(\]\])
答案 1 :(得分:1)
你需要关闭贪婪的匹配。请参阅以下不同语言的示例:
答案 2 :(得分:1)
您应该使用+?
代替+
。
没有问号的那个会尝试尽可能地匹配,而带有问号的那个尽量少。
另一种方法是使用[^\]]
作为您的字符而不是[a-zA-Z.-_]
。这样,匹配永远不会延伸到结束括号。