具有嵌套名称的JavaScript变量的RegEx

时间:2017-09-27 08:23:36

标签: javascript node.js regex

当我需要匹配一个简单的开放值JavaScript变量时,我使用了以下RegEx:

\s*[a-zA-Z0-9$_]+\s*

现在我需要添加对嵌套属性的支持,即名称中可以有点(.),并考虑以下因素:

  • .不能在开头或结尾
  • 单个.本身无效
  • 不允许重复点(a..b

修改这种RegEx模式的最正确/最简单的方法是什么?

如果它有任何区别,我只对在Node.js下工作的版本感兴趣

有效示例

  • a
  • a.b
  • a.b.c
  • _.$.123

无效示例

  • ``
  • .
  • .a
  • a.
  • a..b

1 个答案:

答案 0 :(得分:1)

好吧,我找到的最简单的方法是以下正则表达式

^\s*(([a-zA-Z0-9$_][a-zA-Z0-9$_\.]*[a-zA-Z0-9$_])|([a-zA-Z0-9$_]))\s*$

它匹配至少三个字符的字符串,中间的可选点或有效集的单个字符。它适用于您示例中的数据。如果你想在一行中匹配多个变量,你可以像

一样使用负向前看
\s*(?!\.)[a-zA-Z0-9$_\.]*(?!\.)\s*

后一个表达式也适用于您的测试数据(http://regexr.com/3gra2),但会捕获变量之间的每个空格,因此您可能需要修剪结果。我也担心在长篇文章中,负面展望可能变得非常复杂。

正如我在评论中提到的,从JavaScript代码中提取变量名称的唯一可靠方法是抽象语法树(AST)解析器,它还考虑newvar,{{1}等关键字等等..