Шаблоны регулярных выражений Javascript: совпадают только в том случае, если строка в скобках равна - PullRequest
0 голосов
/ 01 февраля 2012

Я работаю с системой шаблонов javascript для веб-сайта, который я создаю, и у меня возникла небольшая проблема.

Я использую следующее регулярное выражение для сопоставления с разделами в моей строке:

 /(\{\{(#|\^)(.*?)\?\}\}(.*?)\{\{\/(.*?)\?\}\})/

Подача этой строки, такой как:

 {{#is_user?}} The user is an user {{/user?}}

При указании «user» = true отображает строку. Когда is_user установлен в false, строка не отображается. Однако я обнаружил, что это не дает места для вложения как таковое, что:

 {{#is_user?}} The user is an user {{#has_picture?}} and has a picture{{/has_picture?}} {{/user?}}

Это приведет к следующему:

The user is an user  {#is_user?}} The user is an user{{/user?}}   

Таким образом, это означает, что найдено совпадение между {{#is_user?}} И {{/ has_picture?}}, Поскольку регулярное выражение просто проверяет совпадение между {{# anystring?}} И {{/ anystring? }}.

Теперь мой вопрос: возможно ли сказать, что совпадение существует только в том случае, если две строки в скобках равны, так что совпадение найдено только в том случае, если {{#stirngA?}} {{/StringA? coming угр. 1017 *

1 Ответ

2 голосов
/ 01 февраля 2012

Вы можете сделать так, чтобы ваше регулярное выражение совпадало только с соответствующим открывающим тегом, используя обратные ссылки.

Например:

/(\{\{(#|\^)(.*?)\?\}\}(.*?)\{\{\/(\3)\?\}\})/

или без захвата всех групп:

/(?:\{\{(?:#|\^)(.*?)\?\}\}(.*)\{\{\/(?:\1)\?\}\})/

\ 3 (или \ 1) будет содержать значение первого (. *?).

См. Это на rubular .

Но это может не полностью решить вашу проблему вложенных совпадений.Хотя вы можете использовать результат и применить регулярное выражение снова.Может быть, этого достаточно для вашего конкретного случая.

...