我尝试匹配以下字符串:
[[NOTE]]This is my note.[[NOTE]]
以下模式:
This is my note.
由于我无法使用前瞻,这是我目前的尝试:
[^\[\[NOTE\]\]](.*)[^\[\[NOTE\]\]]
但它仍然无效。
答案 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]]
> 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]
匹配任何非c
或a
或t
的字符。*?
才能匹配第一个结束令牌,如果它是一个长模板。如果没有这些错误,它可以完美地运作:\[\[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?