Search code examples
javascriptregexmatchstring-matching

RegEx That Matches Curly Braces and Leading or Trailing Substr Beginning or Ending with Quotes


I have a regex that I am using to match various pairs of curly braces so I can comment them out during development.

My RegEx is:

/{{.+_includes\s*}}|[^>\s]*{{\s*|\s*}}[^<\s]*|{%.+%}/g

And this matches the substrings I've wrapped in # signs:

1.  #{{ #builtin_body_classes# }}#  

2.  #"{{ #builtin_body_classes# }}# no-js"  

3.  "no-js #{{ #builtin_body_classes# }}"#

4.  "no-js some-other-class #{{#builtin_body_classes#}}"#

5.  #{{standard_header_includes}}#

6.  #{{ standard_footer_includes }}#

7.  <title>#{{ #page_meta.html_title# }}#</title>

8.  #{% type_of_module "unique_module_name" parameterString='String parameter value', parmeterBoolean=True %}#

Note the whitespace (two spaces) the lead and trail each line are not matched and nor are the example title tags.

This works exactly as I want for all but two cases — the lines that are wrapped in quotes (cases 2, 3 and 4).

For these cases I would like the quotes and substrings that lead or trail the curly braces also included in the match e.g.

2.  #"{{ #builtin_body_classes# }} no-js"#  

3.  #"no-js {{ #builtin_body_classes# }}"#

4.  #"no-js some-other-class {{#builtin_body_classes#}}"#

Again, I've wrapped the substrings I would like to match between # signs.

Would very much appreciate help to achieve this, and I'm sure my regex could be optimised too ;-)


Solution

  • I've now solved the problem. My regex is:

    /{{.+_includes\s*}}|(?:"+.*|[^>\s]*){{\s*|\s*}}(?:.*"+|[^<\s]*)|{%.+%}/g
    

    You can see my matches below and also live at http://regexr.com/3fijm

    1.  #{{ #builtin_body_classes# }}#  
    
    2.  #"{{ #builtin_body_classes# }} no-js"#  
    
    3.  #"no-js {{ #builtin_body_classes# }}"#
    
    4.  #"no-js some-other-class {{#builtin_body_classes#}}"#
    
    5.  #{{standard_header_includes}}#
    
    6.  #{{ standard_footer_includes }}#
    
    7.  <title>#{{ #page_meta.html_title# }}#</title>
    
    8.  #{% type_of_module "unique_module_name" parameterString='String parameter value', parmeterBoolean=True %}# 
    

    As I said in my original question I am sure this regex could be optimised or improved. So suggestions welcome!