我需要这个正则表达式的帮助..
使用
/\{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
是否可以修改上面的正则表达式,将可选参数a
和b
作为数组?
答案 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中不被认为是常规的语言。这就是为什么你的问题有一个解决方案。但是,开放和关闭实体的计数仍然是不可能的。