负面的前瞻性正则表达式

时间:2013-02-05 07:02:16

标签: javascript regex

我有一个像这样的字符串:

<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}内的所有@{}...{},并将=替换为=&。然后我抓住外面的那些,最后我回来把标记的那些恢复到原来的状态。

2 个答案:

答案 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

UPDATE:

以前只适用于每行{match}

挂钩@实际上意味着一个LookBehind,在这种情况下很难使用LookBehind,因为LookBehind非常想知道要查找多少个字符。

因此,让我们使用LookAhead展望未来: =\{([^{}]+)\}(?![^@]*[^=@]{) ,最后挂钩{tag}

修改:演示http://regex101.com/r/zH7uY6