2011-05-18 51 views
1

鉴于这样的文字:正则表达式来检测嵌套区域

[start block1] 
[end block1] 
lorem 
[start block2] 
ipsum 
[start block2_1] 
[end block2_1] 
dolor 
[end block2] 

是否有可能用一个正则表达式不匹配block2_1块1 &块2。

当然,我们不能依赖块的名称,而只能依赖嵌套在另一个块中的事实。

+0

这是一个愚蠢的缩小版本,但是就像我说的如果你不依赖块的名字,这应该是足够的信息来解决这个问题... – 2011-05-18 09:13:39

+1

所以永远不会有输入像:'[start block1] ... [start block1] ... [end bl ock1] ... [end block1]'(用相同的标签嵌套)? – 2011-05-18 09:27:26

回答

3

试试这个:

\[start (\w+)\].*?\[end \1\] 

只要你不重复任何块名称,你应该罚款。 \1将匹配你已经开始的块的名称,并捕获任何内部的东西。如果你的风格不支持它(如JavaScript),请确保使用点全部选项(或单行),/s[\s\S]*黑客。

在PHP中,使用此代码:

preg_match_all('/\[start (\w+)\].*?\[end \1\]/s', $str, $matches); 

然后,您就可以轻松搞定的名字:

$area_names = $matches[1]; 

工作例如:http://ideone.com/OsbSt

+0

这匹配一切,但lorem – 2011-05-18 09:12:49

+0

@Paté - lorem不在块内。也许我没有正确理解这个问题 - 你期待什么?试着编辑这个问题并解释一下,以及你使用的是什么语言...... – Kobi 2011-05-18 09:14:01

+1

这也是我的回答,如果我没有被“当然我们不能依赖这个块的名字......”声明。我根本不知道这个解决方案是否适用于(稀缺)规范。 – jensgram 2011-05-18 09:15:20