2015-08-21 3 views
0

Другими жесткими регулярными выражениями в JavaScript:Regex выражения для соответствия строки между двумя другими строками

У меня есть эта строка:

<td style="padding:0 2%">{% for product in products.pos01 %}  
<table class="box-item" item-editable="" style="float:left;padding-bottom:10px; width:32%;border-spacing: 0px; border: 0px; border-collapse: collapse;"><tr><td style=" padding:10px 5px; vertical-align:top "> 
<a href="**|product.url|**" class="button view-deal" style="padding:8px 10px; background-color: #fc5d26; text-decoration:none; display:inline-block; text-align:center; color:#fff; font-size:12px;margin:0px; line-height:140%;text-transform:uppercase">view deal</a></div></td></tr></table>{% if (loop.index0-2) is divisibleby 3 %}</td></tr><tr> 
<td style="padding:0 2%">{% endif %}{% endfor %} 
</td> 

Я пытаюсь получить содержимое внутри любых петель из строки {% для ...%} и {%} ENDFOR%

Я попытался с, но не может получить

/({% для (!?%}) +%}) ((! ? endfor) *) {% endfor%}/gm

но не работает

+0

Возможно, [этот] (https://regex101.com/r/oV7rL2/1): '\ {% \ s * для [\ s \ S] *?%} ([\ S \ S ] *?) \ {% \ s * ENDFOR \ s *%} '? –

ответ

1

Попробуйте это регулярное выражение:

{% for [^\0]+?{% endfor %}

Regex live here.

Объяснение:

{% for   # search for text `{% for ` 
[^\0]+?   # while not input's end 
{% endfor %}  # search for the next `{% endfor %}` 

Или, если вы хотите группы:

{% (for [^\0]+?)%}([^\0]+?){% endfor %} 

Regex live here.

Надеются, что это помогает.

2

Я думаю, что вы думаете, чтобы использовать шаблон, похожий на этот

Regex

(?<={% for[^%]*%})((?:.|\n)*)(?={% endfor %}) 

Объяснение

(?<={% for[^%]*%}): использовать с просмотром назад на поиск шаблона {% for[^%]*%}

(?={% endfor %}): использовать предпросмотр для поиска текста {% endfor %}

((?:.|\n)*): сообщение между для цикла, который захватывается переменной $1

Но в случае, если ваш язык не поддерживает lookaround, вы просто использовать этот

Regex

({% for[^%]*%})((?:.|\n)*)({% endfor %}) 

Объяснение

({% for[^%]*%}): захват шаблон {% for[^%]*%} переменной $1

({% endfor %}): шаблон захвата {% endfor %} с переменной $3

((?:.|\n)*): сообщение между для цикла, который захватывается $2

Просто измените мой regex в соответствии с ограничением на вашем языке, тогда вы это сделаете.

Редактировать

Как я ищу, я думаю Javascript не поддерживают lookaround и другую вещь {, } должны быть побег \. Я уже тестировал регулярное выражение, используя некоторый онлайн-тестер регулярных выражений для Javascript, и я получаю это.

(\{% for[^%]*%\})((?:.|\n)*)(\{% endfor %\}) 

, чтобы получить текст, который вы хотите, вы просто использовать переменную $2.

Дополнительная

В случае, если вы хотите, чтобы захватить сообщение внутри вложенного цикла, например,

Пример Сообщение

{% for product in products.pos01 %} 
    ... 
    {% for product in products.pos02 %} 
     "messages" 
    {% endfor %} 
    ... 
{% endfor %} 

Для захвата "messages" внутри этого вложенного цикла вам просто нужно изменить свое предыдущее регулярное выражение

(\{% for[^%]*%\}(?:.|\n)*\{% for[^%]*%\})((?:.|\n)*)(\{% endfor %\}(?:.|\n)*\{% endfor %\}) 

Объяснение

(\{% for[^%]*%\}(?:.|\n)*\{% for[^%]*%\}): означает «старт for for loop "follo Крыло от «любых символов, включая символ новой строки» и следующим путем «начала цикл»

((?:.|\n)*): наша цель сообщение

(\{% endfor %\}(?:.|\n)*\{% endfor %\}): означает «конец для цикла» следуя за «каких-либо знаков, включая символ новой строки» и следующим путем «end for for loop»

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

+0

спасибо. Что это значит? (?:. | \ n) * –

+1

@AlexandruRada. Это означает: любой символ '.' или' '' новую строку '\ n' как можно больше' (?:) *' - без группировки –

+0

Что делать, если существует несколько циклов {% for%}? Вот почему я пытался исключить с помощью (!? Endfor), но не работал ... –

0

Если вы пытаетесь получить то, что находится в пределах {% for ... %} и {% endfor %} это может работать:

/%}([\W\w]*){%/gm 

Объяснение:

%} matches the characters %} literally 
\W match any non-word character [^a-zA-Z0-9_] 
\w match any word character [a-zA-Z0-9_] 
{% matches the characters {% literally 
g modifier: global. All matches (don't return on first match) 
m modifier: multi-line. 

Пример:

https://regex101.com/r/pM3oX7/1

Непонятно, хотите ли вы получить текст в пределах %} {% или также включить эту часть.

+0

А что, если вы добавите этот текст '{% if ...' до конца текущего ввода? –

+0

@WashingtonGuedes: * Что делать, если .. *. да, я люблю это ... здесь, я дам вам один, чтобы использовать на вашем 'I {% забыл ... что, если ... ewlrkjkendfor%} ... и не endfor%}?' ... аккуратно ! : D –

+0

Спасибо за это .. Я обновил –

Смежные вопросы