正则表达式具有相同的打开和关闭可选标记

时间:2011-11-05 10:45:15

标签: regex

我需要这个正则表达式的帮助..

使用

/\{block:(Posts|Photos|Videos)(\s\[.*?\])?\}(\s?[^\"]+\s?)\{\/block\}/U

我从中得到{block:Posts}abcdef{/block}

<div>
 {block:Posts [a=1, b=2]}
  abcdef
 {/block}
</div>

但如果我的文字是这样的:

<div>
 {block:Posts [a=1, b=2]}
  {block:Text}
   abcdef
  {/block}
 {/block}
</div>

我得到{block:Posts}{block:Text}abcdef{/block}因为它基于文本中找到的第一个{/block}

避免这种情况的一种简单方法是使用{/block:Posts}关闭块,但是我怎么能这样做,因为开始块标记是可选的(帖子|照片|视频)?如果我打开带有照片的区块,我必须确保必须使用{/block:Photos}关闭它。

使用/\{block:(Posts|Photos|Videos)(\s\[.*?\])?\}(\s?[^\"]+\s?)\{\/block\:(Posts|Photos|Videos)\}/U当然没有帮助......

有人可以帮助我吗?

谢谢!

PS
是否可以修改上面的正则表达式,将可选参数ab作为数组?

2 个答案:

答案 0 :(得分:1)

您的问题可能有一个更好的解决方案,但在这种情况下您可以使用backreference,因为(Posts|Photos|Videos)已经是捕获组:

\{\/block:\1\}

答案 1 :(得分:1)

您可以使用backreference

执行此操作
\{block:(Posts|Photos|Videos)(\s\[.*?\])?\}(\s?[^\"]+\s?)\{\/block\1\}

请注意最后添加的反向引用\1。反向引用将匹配第一组匹配的任何内容,即第一对括号,在我们的例子(Posts|Photos|Videos)中。

但请注意,一般来说,正则表达式太有限,无法解析像this post所解释的HTML等语言。需要计算开放实体(如括号或标签)然后匹配关闭实体的确切数量的语言不能使用正则表达式表达。由于这个原因,不常规的语言的另一个例子是带括号的算术表达式的语言或由 aa ... abb ... b 形式的字符串组成的语言相同数量的 a b 。这一事实的一般证据使用Pumping Lemma

另请注意,软件工具中使用的正则表达式通常比裸数学正则表达式更强大,因为除了这些软件工具提供的union,concatenation和Kleene star的基本操作之外还有许多新增功能。反向引用本身构成了正则表达式的一个重要增强,允许人们表达mathematical sense中不被认为是常规的语言。这就是为什么你的问题有一个解决方案。但是,开放和关闭实体的计数仍然是不可能的。

相关问题