regexp excluye char

时间:2016-05-09 10:05:34

标签: javascript regex

我正在尝试创建具有以下特征的正则表达式。

  1. {{
  2. 开头
  3. 可能包含换行符和任何字符
  4. 可能不包含}}
  5. 示例

    **没关系。

    {{dog car blue #hello#

    这不行。

    {{dog car blue}} #hello#

    我用regexp尝试了它:

    {{2}([\s\S]*?)[^\{]#hello#
    

    但总是返回确定

2 个答案:

答案 0 :(得分:1)

这个也处理换行符。因此,您可以选择多行。

{{[^{]*#hello#

Regular expression visualization

Debuggex Demo

Regex101 Demo

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#的展开式变体,它更具可读性,但效率极低,更容易出现灾难性的回溯问题。

详细说明:

  • {{ - 匹配{{
  • [^#}]* - 除#}
  • 以外的0个字符
  • (?:}(?!})[^#}]*|#(?!hellow#)[^#}]*)* - 匹配任意一个的0+序列
    • }(?!})[^#}]* - }未跟随},然后是#}以外的1 +个字符
    • | - 或
    • #(?!hellow#)[^#}]* - #未跟hello#后跟{1}}和#以外的1 +个字符
  • } - #hello#