我正在尝试创建具有以下特征的正则表达式。
示例
**没关系。
{{dog car blue #hello#
这不行。
{{dog car blue}} #hello#
我用regexp尝试了它:
{{2}([\s\S]*?)[^\{]#hello#
但总是返回确定
答案 0 :(得分:1)
这个也处理换行符。因此,您可以选择多行。
{{[^{]*#hello#
var str = "{{House () dog {{ dog #hello#";
str = str.match(/{{[^{]*#hello#/g)[0];
document.write(str);
答案 1 :(得分:0)
您需要一个驯化贪婪令牌解决方案,因为您需要先匹配多字符前导分隔符{{
,然后您需要匹配 #hello#
和{{
以外的任何文本(多字符序列)。如果你不得不否定一个字符,那么[^{]
就足够了。情况并非如此。
使用
/{{[^#}]*(?:}(?!})[^#}]*|#(?!hellow#)[^#}]*)*#hello#/g
请参阅regex demo
请注意,它是{{(?:(?!}}|#hellow#)[\s\S])*#hello#
的展开式变体,它更具可读性,但效率极低,更容易出现灾难性的回溯问题。
详细说明:
{{
- 匹配{{
[^#}]*
- 除#
和}
(?:}(?!})[^#}]*|#(?!hellow#)[^#}]*)*
- 匹配任意一个的0+序列
}(?!})[^#}]*
- }
未跟随}
,然后是#
和}
以外的1 +个字符|
- 或#(?!hellow#)[^#}]*
- #
未跟hello#
后跟{1}}和#
以外的1 +个字符}
- #hello#
。