2011-04-11 21 views
3

我想寫一個正則表達式,它在給定的JavaScript代碼片段中查找所有變量(並且只有變量,完全忽略方法)。實際的代碼(執行正則表達式的代碼)是用Java編寫的。正則表達式來查找變量和忽略方法

現在,我有這樣的事情:

Matcher matcher=Pattern.compile(".*?([a-z]+\\w*?).*?").matcher(string); 
while(matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

所以,當 「串」 的價值variable*func()*20

打印輸出:

variable 
func 

這是不是我想要。 (的簡單否定不會這樣做,因爲它使得正則表達式捕獲不必要的字符或將其截斷,但仍然捕獲函數。現在,我有以下代碼:

Matcher matcher=Pattern.compile(".*?(([a-z]+\\w*)(\\(?)).*?").matcher(formula); 
while(matcher.find()) { 
    if(matcher.group(3).isEmpty()) { 
     System.out.println(matcher.group(2)); 
    } 
} 

它的工作,打印輸出是正確的,但我不喜歡額外的檢查。有任何想法嗎?請?

EDIT(2011-04-12):

感謝所有的答案。有問題,爲什麼我需要這樣的東西。如果腳本更大更復雜,唯一合理的解決方案就是解析它們。但就我而言,這將是過度的。我正在研究的JS碎片只是簡單的公式,就像(a+b)/2。沒有評論,字符串文字,數組等。只有變量和(可能)一些內置函數。我需要變量列表來檢查它們是否可以初始化並且這一點(並且完全初始化)。我意識到所有這些都可以通過RPN手動完成(這會更安全),但是這些公式將被更大的腳本包裹並在Web瀏覽器中進行評估,因此這樣更方便。

這可能有點髒,但是假設誰在寫這些公式(可能是我,大部分時間),知道在做什麼並且能夠檢查他們是否正常工作。

如果有人發現這個問題,想要做類似的事情,現在應該是風險/困難。我這樣做,至少我希望如此;)

+1

這不完全相同,但是,看看這個asnwer:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454正則表達式不是萬能的! – Serafeim 2011-04-11 13:21:35

回答

1

考慮到關於正則表達式如何不是考慮工作的最佳工具的所有合理建議都很重要。但是,你可能會逃脫一個快速和骯髒的正則表達式,如果你的規則很簡單(和你都知道,規則的限制):

Pattern regex = Pattern.compile(
    "\\b  # word boundary\n" + 
    "[A-Za-z]# 1 ASCII letter\n" + 
    "\\w* # 0+ alnums\n" + 
    "\\b  # word boundary\n" + 
    "(?!  # Lookahead assertion: Make sure there is no...\n" + 
    " \\s* # optional whitespace\n" + 
    " \\( # opening parenthesis\n" + 
    ")  # ...at this position in the string", 
    Pattern.COMMENTS); 

此標識由一個括號,只要它不遵循一致。當然,現在你需要group(0)而不是group(1)。當然這匹配了很多其他的東西(在字符串,評論等)...

+0

非常感謝!這正是我需要的,你的回答不僅解決了我的問題,而且提供了很多信息。我現在感覺更聰明瞭:)它會抓住其他的東西,但 - 正如我在更新的問題中所述 - 在我的情況下是可以接受的。 – genobis 2011-04-12 08:44:19

1

這是非常確定的正則表達式不能可靠地用於解析結構化輸入。看到這裏著名的響應:RegEx match open tags except XHTML self-contained tags

爲字符的任何給定的順序可能會或可能不會取決於字符的前面或後面的序列改變的意思,你不能可靠地確定一個語法元素不都詞法分析輸入文本。正則表達式可用於前者(將輸入流分成令牌),但後者不能可靠地使用正則表達式(根據它們在流中的位置賦予令牌的含義)。

+0

我還沒有見過,最好的迴應!是的,我認爲你是對的。其他海報提到了一些解析器,但我認爲這會對我來說有點過分... – genobis 2011-04-12 08:49:14

1

如果您正在使用正則表達式重新思考並且想知道您可以做些什麼,您可以考慮使用AST代替以編程方式訪問源代碼。 This answer顯示您可以使用Eclipse Java AST爲Java源創建語法樹。我想你可以做類似的Javascript。

+0

我已經用google了一下,我發現我確實可以(http://help.eclipse.org/helios/index .jsp?topic =/org.eclipse.wst.jsdt.doc/reference/api/org/eclipse/wst/jsdt/core/dom/AST.html)。這可能對我目前的需求來說太重了,但是謝謝 - 我不知道這一點,並且知道我自己,我會盡快得到它:) – genobis 2011-04-12 08:39:20

1

在這種情況下,正則表達式不會削減,因爲Java不規則。你最好的辦法是得到一個能夠理解Java語法的解析器,然後構建它。幸運的是,ANTLR有一個Java 1.6 grammar(和1.5 grammar)。

對於您的相當有限的用例,您可以輕鬆擴展變量賦值規則並獲取所需的信息。這是一個學習曲線,但這可能是您最好的一個快速和準確的解決方案。

+0

最初的問題是針對JavaScript,而不是java。 ANTLR也有一個JS語法(在這裏:http://www.antlr.org/grammar/1206736738015/JavaScript.g)。與往常一樣,當答案開始變得非常複雜時,我建議開發者自問他們是否首先提出了正確的問題。 @genobis - 你爲什麼需要這樣做? – AndyT 2011-04-11 14:06:54

+0

@genobis - 查看我的答案爲什麼正則表達式無法正常工作。 – AndyT 2011-04-11 16:46:30