2017-09-27 57 views
0

當我需要匹配一個簡單的開值JavaScript變量,我用下面的正則表達式:正則表達式的JavaScript變量與嵌套名稱

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

現在我需要添加嵌套屬性的支持,也就是說,可點(.)之名,但有以下考慮:

  • .不能在開頭或結尾
  • 本身就是一個單一.無效
  • 重複點(a..b)不準

什麼會修改這樣的正則表達式模式右/最簡單的方法?

如果這有什麼差別,我只對一個版本感興趣,將Node.js的下工作


有效例子

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

無效實例

  • ``
  • .
  • .a
  • a.
  • a..b
+0

應該括號表示法也有效嗎?我的意思是你可以寫一個[「b」],例如與a.b相同。變量名也不能以數字開頭,所以我會尋找更完美的解決方案。 – Manticore

+0

@Manticore好問題!在我的情況 - 不,我不需要括號;) –

+1

這裏是我的方法:(?!\ n)\ s * [\ w $] +(\。\ w +)*(?= \ s * \ =。 *?\;) – Manticore

回答

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,function等。

+0

'''規則有點麻煩 - 不應該允許在名稱中重複的點;) –

+0

我接受了答案,即使是最後一項要求。沒有遇到。但我採取了一種更簡單快捷的方法 - 接受所有的點,並在稍後檢查有效性。所以,基本上我最終並不需要答案。不過謝謝你! –

+0

哦對,忘了雙點,抱歉。我想知道爲什麼它必須是全部正則表達式,所以我很高興你找到了更快的方法。感謝接受。 – Peter