Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于具有嵌套名称的JavaScript变量的正则表达式_Javascript_Node.js_Regex - Fatal编程技术网

用于具有嵌套名称的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 好的,我找到的最简单的方法是下面的正则

当我需要匹配一个简单的开值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$_][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,在
      规则中有点麻烦。
      规则-不允许在名称中重复点;)我接受了答案,尽管没有满足
      的最后一个要求。但我选择了一种更简单、更快的方法——接受所有的点,然后检查其有效性。所以,基本上我最终不需要答案。不过还是要谢谢你!哦,对了,忘了双点,对不起。我想知道为什么它必须全部是正则表达式,所以我很高兴你找到了一个更快的方法。谢谢你接受。