正则表达式匹配两个其他字符串之间的字符串

时间:2015-08-21 16:25:03

标签: javascript regex

javascript中的另一个硬正则表达式:

我有这个字符串:

    <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>

我正在尝试从字符串{%for ...%}和{%endfor%}

的任何循环中获取内容

我已尝试过,但无法获得

  

/({%for(!?%})+%})((!?endfor)*){%endfor%} / gm

但没有效果

3 个答案:

答案 0 :(得分:2)

我认为您假设使用与此类似的模式

<强>正则表达式

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

<强>解释

(?<={% for[^%]*%}):使用lookbehind搜索模式{% for[^%]*%}

(?={% endfor %}):使用预测来搜索文本{% endfor %}

((?:.|\n)*):变量$1

捕获的for循环之间的消息

但如果您的语言不支持环视,您只需使用此

即可

<强>正则表达式

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

<强>解释

({% for[^%]*%}):将模式{% for[^%]*%}捕获到变量$1

({% endfor %}):将模式{% endfor %}捕获到变量$3

((?:.|\n)*)$2

捕获的for循环之间的消息

只需根据您所用语言的限制修改我的regex即可完成此操作。

修改

在我搜索时,我认为Javascript不支持环视,而{}需要通过\转义。我已经使用一些在线正则表达式测试程序为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[^%]*%\}):表示&#34;开始for循环&#34;跟随&#34;任何字符,包括换行符&#34;然后按&#34;开始循环&#34;

((?:.|\n)*):我们的目标消息

(\{% endfor %\}(?:.|\n)*\{% endfor %\}):表示&#34; for循环结束&#34;跟随&#34;任何字符,包括换行符&#34;并按照&#34;结束for循环&#34;

请注意,我只是重新安排了我以前的正则表达式来完成这个更复杂的工作。

答案 1 :(得分: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 :(得分: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

目前还不清楚您是想要在%} {%内获取文字还是包含该部分。