在javascript正则表达式中否定并重复一个原子组

时间:2015-07-07 15:54:24

标签: javascript regex

我需要

  • 匹配{{
  • 启动捕获组
  • 任何不是}}
  • 的内容
  • 结束捕获
  • 匹配}}

样品:

dummy text
{{ text to be matched }}
more dummy text dummy
dummy {{ foo { bar }} dummy text
dummy text
{{}}}

结果:

  

匹配1:{{ text to be matched }}

     
    

第0组:text to be matched

  
     

匹配2:{{ foo { bar }}

     
    

第0组:foo { bar

  
     

匹配3:{{}}}

     
    

第0组:}

  

我遇到的问题是not }}部分,因为Javascript没有原子组。

我不能否定非捕获组并像这样重复它

{{                  match {{
    (               capture
        ^(?:}})+    not "}}" 1+ times 
    )               end capture
}}                  match }}

这种/{{(.+)}}/有效但只有我没有换行符。

3 个答案:

答案 0 :(得分:3)

为了满足您的要求,您可以使用以下模式:

{{([^}]*(?:}[^}]+)*}*)}}

细节:

{{
(
    [^}]*         # all that is not a closing bracket
    (?:
        }[^}]+    # a closing bracket followed by at least one other character
    )*
    }*            # eventual closing brackets at the end
)
}}

另一种方式(更短但效率更低):

{{([^]*?)}}(?!})

注意:问题与原子组无关。

答案 1 :(得分:0)

试试这个:

/\{\{([\s\S]+?)\}\}/

序列[\s\S]任何字符匹配,包括EOL。然后一个懒惰的量词(+?)保存了这一天。

答案 2 :(得分:0)

  

这/ /({。+)}}}}}有效,但只有我没有换行符。

JS正则表达式中的

.与换行符不匹配 - 您可以在正则表达式中使用[\s\S]