用于具有嵌套名称的JavaScript变量的正则表达式
当我需要匹配一个简单的开值JavaScript变量时,我使用了以下正则表达式:用于具有嵌套名称的JavaScript变量的正则表达式,javascript,node.js,regex,Javascript,Node.js,Regex,当我需要匹配一个简单的开值JavaScript变量时,我使用了以下正则表达式: \s*[a-zA-Z0-9$_]+\s* 现在我需要添加对嵌套属性的支持,即名称中可以有点(),需要考虑以下因素: 不能在开头或结尾 单个本身无效 不允许重复点(a..b) 修改这种正则表达式模式的正确/最简单的方法是什么 如果有什么不同的话,我只对Node.js下的版本感兴趣 有效示例 a a.b a.b.c .$.123 无效示例 `` .a a. a..b 好的,我找到的最简单的方法是下面的正则
\s*[a-zA-Z0-9$_]+\s*
现在我需要添加对嵌套属性的支持,即名称中可以有点(
),需要考虑以下因素:
不能在开头或结尾- 单个
本身无效 - 不允许重复点(
)a..b
有效示例
a
a.b
a.b.c
.$.123
- ``
.a
a.
a..b
- 好的,我找到的最简单的方法是下面的正则表达式
^\s*(([a-zA-Z0-9$_][a-zA-Z0-9$_\.]*[a-zA-Z0-9$_])|([a-zA-Z0-9$_]))\s*$
它匹配至少三个字符的字符串,中间有可选的点或有效集的单个字符。它适用于示例中的数据。如果你想在一行中匹配多个变量,你可以使用一个消极的前瞻,比如
\s*(?!\.)[a-zA-Z0-9$_\.]*(?!\.)\s*
后一个表达式也适用于您的测试数据(),但将捕获变量之间的所有空白,因此您可能需要修剪结果。我还担心长文本中的负面表情可能会变得非常复杂
正如我在评论中提到的,从JavaScript代码中提取变量名的唯一可靠方法是一个抽象语法树(AST)解析器,它还考虑诸如
new
、var
、function
等关键字。括号符号也应该有效吗?我的意思是你可以写一个[“b”],例如,它与a.b.相同。变量名称不能以数字开头,因此我会寻找一个更完美的解决方案。@Manticore问得好!在我的情况下-不,我不需要括号;)以下是我的方法:(?!\n)\s*[\w$]+(\.\w+)*(?=\s*\=.*?\;)您能分享一个测试片段吗?我也看到了。这里:但我想我误解了你的问题,看看你自己的正则表达式fiddle,在规则中有点麻烦。
规则-不允许在名称中重复点;)我接受了答案,尽管没有满足。
的最后一个要求。但我选择了一种更简单、更快的方法——接受所有的点,然后检查其有效性。所以,基本上我最终不需要答案。不过还是要谢谢你!哦,对了,忘了双点,对不起。我想知道为什么它必须全部是正则表达式,所以我很高兴你找到了一个更快的方法。谢谢你接受。