4

我有一个这样的字符串:

<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}我目前的解决方案是在里面找到所有内容@{}...{}==&. 然后我抓住外面的那些,最后我回来将标记的那些替换回原来的状态。

4

2 回答 2

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- 还是在@{}...{}段内。它使用反向引用来匹配结尾和开头。

然后,根据细分,您可以正常执行替换。

于 2013-02-05T07:41:49.610 回答
0

{whatever}给你,也需要消极展望结局

/(?!@.*)=\{([^{}]+)\}(?!.*\{[^{}]+\})/g

更新:

以前只适用于{match}每行。

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

所以让我们使用 LookAhead 来展望未来:=\{([^{}]+)\}(?![^@]*[^=@]{)最后有钩子{tag}

编辑:演示http://regex101.com/r/zH7uY6

于 2013-02-05T07:16:50.097 回答