我可以用一个正则表达式解决以下问题吗?我知道可以用两个单独的正则表达式来完成,但是我很好奇是否可以只用一个来完成吗?
查找以$ _开头的单词(变量)的所有实例,但仅当它们落在模板插值定界符(<%=和%>)之间的任意位置时
因此,带有以下文本:
<div>
<% if ( $_createDiv) { %>
<div>Div created!</div>
<% } %>
<h2>
<span><%= $_var1 %></span>
</h2>
<div><%= markdown.toHTML($_var2 ) %></div>
<div><%= $_var3 +' more text ' + $_var4 %></div>
</div>
预期结果应仅为:$ _var1,$ _ var2,$ _ var3,$ _ var4注意:$ _createDiv不应返回,因为它位于“求值”定界符中(<%而不是<%=)
https://regex101.com/r/dAesYE/1
是否可以使用单个正则表达式来执行此操作,还是我需要使用两个正则表达式?我可以通过运行两个/(?<=<%=).*(?=%>)/gm
来查找定界符之间的所有文本,然后遍历结果并运行/\B\$_\w+/gm
以获取变量。我只是好奇是否可以使用单个正则表达式。
对于上下文,我试图找到它们,以便可以运行替换以将变量名括在一个函数中,例如:
myFunc($_var1)
假设您可以针对ECMAScript 2018+兼容环境,则可以使用
/(?<=<%=(?:(?!<%=|%>).)*)\B\$_\w+(?=(?:(?!<%=|%>).)*%>)/gs
请参阅regex演示。否则,您应该使用当前的两步方法。
详细资料:
(?<=<%=(?:(?!<%=|%>).)*)
-向后的正向查找,要求其图案立即匹配当前位置的左侧:
<%=
-子字符串(?:(?!<%=|%>).)*
-不会开始a<%=
或%>
char序列的任意一个char,零次或多次出现,并尽可能多\B\$_\w+
-一个$
char前面有一个非单词char_
和一个或多个单词char(?=(?:(?!<%=|%>).)*%>)
-正向前瞻,要求其图案立即匹配当前位置的右侧:
(?:(?!<%=|%>).)*
不开始a<%=
或%>
char序列的任意一个char,零个或多个出现,并尽可能多%>
-%>
子字符串。请参阅JavaScript演示:const regex = /(?<=<%=(?:(?!<%=|%>).)*)\B\$_\w+(?=(?:(?!<%=|%>).)*%>)/gs;
const text = "<div>\r\n <% if ( $_createDiv) { %>\r\n <div>Div created!</div>\r\n <% } %>\r\n <h2>\r\n <span><%= $_var1 %></span>\r\n </h2>\r\n <div><%= markdown.toHTML($_var2 ) %></div>\r\n <div><%= $_var3 +' more text ' + $_var4 %></div>\r\n</div>";
console.log(text.match(regex));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句