当我需要匹配一个简单的开放值JavaScript变量时,我使用了以下RegEx:
\s*[a-zA-Z0-9$_]+\s*
现在我需要添加对嵌套属性的支持,即名称中可以有点(.
),并考虑以下因素:
.
不能在开头或结尾.
本身无效a..b
)修改这种RegEx模式的最正确/最简单的方法是什么?
如果它有任何区别,我只对在Node.js下工作的版本感兴趣
有效示例
a
a.b
a.b.c
_.$.123
无效示例
.
.a
a.
a..b
答案 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)解析器,它还考虑new
,var
,{{1}等关键字等等..