2015-08-14 83 views
0

我有以下的正则表达式,我想从文本中提取一些与(n)的参数模板标签:正则表达式,我想回到一个子匹配(n)的值

\{{2}([\w\-\d]+)([\s:\,]*(?:\[([\w\%]+)\])*)*\}{2} 

但问题是上面的正则表达式只返回最后一个参数,我想捕获所有参数。这个参数也可以重复多次。我看不出什么是错的。有人可以帮助我吗?

Exemples:

Exemple 1 {{url-builder: [linktitle], [email]}} // Return ['url-builder', 'email'] 
Exemple 2 {{url-builder: [linktitle]}} // Return ['url-builder', 'linktitle'] 

为例1应返回[ '网址建设者', '链接标题', '电子邮件']

更具体地讲,我有如下文字

Aocontráriodo que se acredita,Lorem Ipsumnãoésimplesmente um textorandômico。 com mais de 2000 anos,{{url-builder:[linktitle],[email]}} suasraízespodem ser encontradas em uma {{author-name}} obra de literatura latinaclássicadatada de 45 AC。理查德麦克林托克,这位教授是尼泊尔汉普登 - 悉尼学院的教授,

从上面的文字中,我想抓住所有标签{{tag}}。但是一些标签可以有参数{{tag:parameter-1}},并且这些参数可以重复多次{{tag:parameter-1:parameter-1}}。我试图用标签和所有参数来捕获单个数组。

+0

你使用什么正则表达式风味/工具/编程语言?你如何从匹配结果中提取捕获组? – Bergi

+0

我正在使用php来分析时事通讯模板。 – user2434945

回答

0

是的,捕获组通常只存储其模式的最后一次出现。你可以用所有的参数在一组,让他们:

\{\{([\w\-]+):\s*((?:\[[\w\%]+\][,\s]*)*)\}\} 
    ^ ^^     ^

然后拆分后通过/[,\s]+/得到一个列表。

+0

使用两个正则表达式来捕获标签看起来很丑陋,但是,如果捕获组仅存储其最后一次出现的模式,那么我就没有别的办法了。感谢帮助。 – user2434945

+0

@ user2434945:它们不适用于所有正则表达式引擎。根据您的编程语言,可能有一种方法可以访问早期的匹配。我不确定PHP,请检查文档。 – Bergi