在javascript中的Lookahead正则表达式模式

时间:2014-09-04 12:14:30

标签: javascript regex

我尝试匹配以下字符串:

[[NOTE]]This is my note.[[NOTE]]

以下模式:

This is my note.

由于我无法使用前瞻,这是我目前的尝试:

[^\[\[NOTE\]\]](.*)[^\[\[NOTE\]\]]

但它仍然无效。

4 个答案:

答案 0 :(得分:1)

您当前的正则表达式无法正常工作。一些要点:

  • 您将所有内容都放在角色类中:[^...]。它使正则表达式匹配列表中的一个字符,在这种情况下你想要的。删除它们。

  • 如果我正确理解了您的问题,那么您实际上并不需要为您尝试做的事情寻找表情。而JavaScript 确实支持前瞻;但它并不支持外观。

假设您尝试匹配开始和结束[[NOTE]]标记之间的文字,为什么不使用:

\[\[NOTE\]\]([^\[\]]+)\[\[NOTE\]\]

说明:

  • \[\[NOTE\]\]匹配[[NOTE]]

  • [^\[\]]+是一个否定的字符类,匹配一个或多个不是[]的字符。

答案 1 :(得分:1)

使用您在第一个捕获组中捕获的内容:

var re = /\[\[NOTE]](.*?)\[\[NOTE]]/; 
var str = '[[NOTE]]This is my note.[[NOTE]]';
var m = re.exec(str);

console.log(m[1])
// This is my note.

通过添加*来避免与?量化者保持一致,以避免在

中匹配This a note[[NOTE]][[NOTE]]Also note
[[NOTE]]This a note[[NOTE]][[NOTE]]Also note[[NOTE]]

答案 2 :(得分:0)

您需要转义正则表达式中的开始[括号,并且还必须从字符类中删除^符号。

\[\[NOTE]]((?:(?!\[\[NOTE]]).)*)\[\[NOTE]]

DEMO

> var re = /\[\[NOTE]]((?:(?!\[\[NOTE]]).)*)\[\[NOTE]]/g;
undefined
> var str = '[[NOTE]]This is my note.[[NOTE]]';
undefined
> var m;
undefined
> while ((m = re.exec(str)) != null) {
... console.log(m[1]);
... }
This is my note.

答案 3 :(得分:0)

首先,ja中的预测是fully supported(看不后面)。

在你的正则表达式[^\[\[NOTE\]\]](.*)[^\[\[NOTE\]\]]

  • []只能检查是否存在单个字符。例如,[^cat]匹配任何非cat的字符。
  • 在中间,您需要lazy quantifier*?才能匹配第一个结束令牌,如果它是一个长模板。

如果没有这些错误,它可以完美地运作:\[\[NOTE\]\](.*?)\[\[NOTE\]\]

  • 它匹配[[NOTE]]This is my note.[[NOTE]]和第一个捕获组This is my note.

捕获开始令牌并使用结束标记使用backreference的另一个选项:

  • (\[\[NOTE\]\])(.*?)\1

或者您可以使用positive lookahead

  • (\[{2,2}NOTE\]{2,2})(.*?)(?=\1)
    所以正则表达式只会匹配[[NOTE]]This is my note.

如果您想使用其他结尾标记,例如[[/NOTE]],那么您可以使用以下内容:

  • \[{2,2}(NOTE)\]{2,2}(.*?)(?=\[{2,2}\/\1\]{2,2})
  • \[{2,2}(NOTE)\]{2,2}(.*?)\[{2,2}\/\1\]{2,2}

如果要使用嵌套的open-close语句,则只能通过标记解析模板标记。通过perl兼容的正则表达式,有一种称为recursive regex的东西。有了它,解析嵌套的开放式模板就容易得多了,但javascript中没有这个功能......如果你不想支持嵌套结构,那么实际的正则表达式就足够了。使用第一个捕获组而不是完全匹配,这就是全部。 Lookaround没有必要......

顺便说一下。我强烈建议您使用现有的模板系统,我们不需要另一个... What Javascript Template Engines you recommend?