以下是示例文本(从原文简化):
<start1>
<name="4654">
bla bla bla bla
<tags="bla" model="c">
bla bla bla bla
<start2>
<name="12346">
bla bla bla bla
<tags="bla" model="d">
bla bla bla bla
<start3>
<name="73535">
bla bla bla bla
<tags="bla" model="c">
<start4>
<name="546875">
bla bla bla bla
<tags="bla" model="c">
bla bla bla bla
这是我的正则表达式(点匹配新行选项已启用)
name="([\d]+)".+?(?<!start)tags="([^"]+?)" model="c"
正如您所看到的,有4个区块,但我需要匹配那些带有model =“c”的区块。但是.+?
捕获的内容超出了需要。设防负面观察以抑制它不起作用......任何想法如何排除阻止?
更新(澄清我想要实现的目标):
我希望在3个块之后匹配样本数据:
第一场比赛
<name="4654">
bla bla bla bla
<tags="bla" model="c">
第二场比赛
<name="73535">
bla bla bla bla
<tags="bla" model="c">
第三场比赛
<name="546875">
bla bla bla bla
<tags="bla" model="c">
答案 0 :(得分:2)
是否始终采用( start
,name
,tags
),(start
,name
,{{1}的格式}), 等等?如果是这样,你甚至可以不用环顾。
tags
这是有效的,因为您知道您遇到的下一个/<name="(\d+)"[^<]+?<tags="([^"]+?)" model="c">/s
将是紧随其后的<
标签。我们可以保证是这种情况,还是我们需要更一般地允许混合中的其他标签?
此外,您是否需要在tags
之后和下一个<tags>
之前捕获文字?如果是这样,你可以为此添加一些额外的东西。
<start>
击> <击> 撞击>
好的,根据你的评论,情况并非如此。然后抓一点。
更新
好的,怎么回事呢?
/<name="(\d+)"[^<]+?<tags="([^"]+?)" model="c">[^<]*(?!<start)/s
这实际上使用的是前瞻,而非后视。一个简单的超前/ lookbehind只会声明一个字符串出现在一个文本块之前或之后,而不是在一个文本块之内。通过使用/<name="(\d+)"(?:(?!<start).)+<tags="([^"]+?)" model="c">/s
检查每个字符,您可以有效地确保整个文本中不包含“str”。
我使用前瞻检查((?!str).)+
可能看起来很混乱,而<start
的后瞻看起来像start
而不是(?<!start)
。
请考虑(?!<start)
与(?!(<start))
。
我添加(?<!(start))
只是为了不会捕获。
答案 1 :(得分:0)
尝试更改排除模式,使模型=“c”非贪婪,而不是消极的外观。
name="([\d]+)".+?(?!model=)tags="([^"]+?)" model="c"