我有一个像这样的字符串:
<p>Year: ={year}</p>\
<p>Director: ={director}</p>\
<ul>@{actors}<li class="#{class}">={actor}</li>{actors}</ul>\
我想提取不在={match}
内的所有@{word}...{word}
,因此在这种情况下,我希望匹配={year}
和={director}
,而不是={actor}
。这是我到目前为止所得到的,但它不起作用。
/(?!@.*)=\{([^{}]+)\}/g
有什么想法吗?
修改:我当前的解决方案是查找={match}
内的所有@{}...{}
,并将=
替换为=&
。然后我抓住外面的那些,最后我回来把标记的那些恢复到原来的状态。
答案 0 :(得分:3)
您可以使用正则表达式将字符串分解为段,如下所示:
var s = '<p>Year: ={year}</p> \
<p>Director: ={director}</p> \
<ul>@{actors}<li class="#{class}">={actor}</li>{actors}</ul>',
re = /@\{([^}]+)\}(.*?)\{\1\}/g,
start = 0,
segments = [];
while (match = re.exec(s)) {
if (match.index > start) {
segments.push([start, match.index - start, true]);
}
segments.push([match.index, re.lastIndex - match.index, false]);
start = re.lastIndex;
}
if (start < s.length) {
segments.push([start, s.length - start, true]);
}
console.log(segments);
根据您的示例,您将获得以下细分:
[
[0, 54, true],
[54, 51, false],
[105, 5, true]
]
布尔值表示您是在外面 - true
- 还是在@{}...{}
段内。它使用反向引用将结尾与开头匹配。
然后,根据细分,您可以按照正常情况执行替换。
答案 1 :(得分:0)
在这里,你需要消极地向前看{whatever}
结尾
/(?!@.*)=\{([^{}]+)\}(?!.*\{[^{}]+\})/g
以前只适用于每行{match}
。
挂钩@
实际上意味着一个LookBehind,在这种情况下很难使用LookBehind,因为LookBehind非常想知道要查找多少个字符。
因此,让我们使用LookAhead展望未来: =\{([^{}]+)\}(?![^@]*[^=@]{)
,最后挂钩{tag}