正则表达式 - 查找所有以 $_ 开头且位于模板字符串之间的单词
Regex - find all words starting with $_ that fall anywhere between template strings
我可以用一个正则表达式解决以下问题吗?我知道可以用两个单独的正则表达式来完成,但我很好奇是否可以只用一个来完成?
查找以 $_ 开头的单词(变量)的所有实例,但仅当它们落在模板内插定界符(<%= 和 %>)之间的任何位置时
所以用下面的文字:
<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
是否可以使用一个正则表达式来完成此操作,还是我需要使用两个?
我可以通过 运行ning /(?<=<%=).*(?=%>)/gm
使用两个来查找定界符之间的所有文本,然后遍历结果和 运行 /\B$_\w+/gm
来获取变量。
我只是好奇是否可以使用单个正则表达式。
对于上下文,我试图找到它们,以便我可以 运行 替换以用函数包围变量名,例如:
myFunc($_var1)
假设您可以针对 ECMAScript 2018+ 兼容环境,您可以使用
/(?<=<%=(?:(?!<%=|%>).)*)\B$_\w+(?=(?:(?!<%=|%>).)*%>)/gs
见regex demo。否则,您应该使用当前的两步法。
详情:
(?<=<%=(?:(?!<%=|%>).)*)
- 正后视要求其模式立即匹配到当前位置的左侧:
<%=
- 子串
(?:(?!<%=|%>).)*
- 任何一个字符,出现零次或多次,尽可能多,不开始 <%=
或 %>
字符序列
\B$_\w+
- $
字符前面有一个非单词字符 _
和一个或多个单词字符
(?=(?:(?!<%=|%>).)*%>)
- 正向前瞻,要求其模式立即匹配到当前位置的右侧:
(?:(?!<%=|%>).)*
任何一个字符,出现零次或多次,尽可能多,不开始 <%=
或 %>
字符序列
%>
- %>
子字符串。
请参阅 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));
我可以用一个正则表达式解决以下问题吗?我知道可以用两个单独的正则表达式来完成,但我很好奇是否可以只用一个来完成?
查找以 $_ 开头的单词(变量)的所有实例,但仅当它们落在模板内插定界符(<%= 和 %>)之间的任何位置时
所以用下面的文字:
<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
是否可以使用一个正则表达式来完成此操作,还是我需要使用两个?
我可以通过 运行ning /(?<=<%=).*(?=%>)/gm
使用两个来查找定界符之间的所有文本,然后遍历结果和 运行 /\B$_\w+/gm
来获取变量。
我只是好奇是否可以使用单个正则表达式。
对于上下文,我试图找到它们,以便我可以 运行 替换以用函数包围变量名,例如:
myFunc($_var1)
假设您可以针对 ECMAScript 2018+ 兼容环境,您可以使用
/(?<=<%=(?:(?!<%=|%>).)*)\B$_\w+(?=(?:(?!<%=|%>).)*%>)/gs
见regex demo。否则,您应该使用当前的两步法。
详情:
(?<=<%=(?:(?!<%=|%>).)*)
- 正后视要求其模式立即匹配到当前位置的左侧:<%=
- 子串(?:(?!<%=|%>).)*
- 任何一个字符,出现零次或多次,尽可能多,不开始<%=
或%>
字符序列
\B$_\w+
-$
字符前面有一个非单词字符_
和一个或多个单词字符(?=(?:(?!<%=|%>).)*%>)
- 正向前瞻,要求其模式立即匹配到当前位置的右侧:(?:(?!<%=|%>).)*
任何一个字符,出现零次或多次,尽可能多,不开始<%=
或%>
字符序列%>
-%>
子字符串。 请参阅 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));