正则表达式来检测嵌套区域
问题描述:
鉴于这样的文字:正则表达式来检测嵌套区域
[start block1]
[end block1]
lorem
[start block2]
ipsum
[start block2_1]
[end block2_1]
dolor
[end block2]
是否有可能用一个正则表达式不匹配block2_1块1 &块2。
当然,我们不能依赖块的名称,而只能依赖嵌套在另一个块中的事实。
答
试试这个:
\[start (\w+)\].*?\[end \1\]
只要你不重复任何块名称,你应该罚款。 \1
将匹配你已经开始的块的名称,并捕获任何内部的东西。如果你的风格不支持它(如JavaScript),请确保使用点全部选项(或单行),/s
或[\s\S]*
黑客。
在PHP中,使用此代码:
preg_match_all('/\[start (\w+)\].*?\[end \1\]/s', $str, $matches);
然后,您就可以轻松搞定的名字:
$area_names = $matches[1];
这是一个愚蠢的缩小版本,但是就像我说的如果你不依赖块的名字,这应该是足够的信息来解决这个问题... – 2011-05-18 09:13:39
所以永远不会有输入像:'[start block1] ... [start block1] ... [end bl ock1] ... [end block1]'(用相同的标签嵌套)? – 2011-05-18 09:27:26