javascript - 正则表达式 - 查找所有以 $_ 开头且位于模板字符串之间任意位置的单词

标签 javascript regex ecmascript-2017

我可以用一个正则表达式解决以下问题吗?我知道可以使用两个单独的正则表达式来完成,但我很好奇是否可以只使用一个正则表达式来完成?

查找以 $_ 开头的单词(变量)的所有实例,但仅当它们位于模板插值分隔符(<%= 和 %>)之间的任何位置时

因此,使用以下文本:

<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 demo 。否则,您应该使用当前的两步方法。

详细信息:

  • (?<=<%=(?:(?!<%=|%>).)*) - 正向后查找,要求其模式立即匹配当前位置的左侧:
    • <%= - 一个子字符串
    • (?:(?!<%=|%>).)* - 任意一个字符,出现零次或多次,尽可能多,不以 <%= 开头。或%>字符序列
  • \B\$_\w+ - 一个$ 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));

关于javascript - 正则表达式 - 查找所有以 $_ 开头且位于模板字符串之间任意位置的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66214605/

相关文章:

javascript - 将 async/await 与 babel js 结合到 es5

javascript - Array#map() 中的异步/等待

javascript - SVG 圆圈在 d3 中堆积

javascript - jQuery if/else

javascript - 如何以 Angular 构建摘录功能

javascript - 跨域 $.ajax 调用引发 ajaxError?

mysql - 如何在 MySQL 中将字符串列读取为列表?

php - 从末尾开始匹配的正则表达式

javascript - 正则表达式定界符重新投入使用

javascript - 异步/等待分配给对象键 : is it concurrent?