2012-07-14 33 views
0

我試圖掃描通過它定義了許多函數的JavaScript文檔,並從文檔中刪除一個函數。我希望我能在這裏做一個微不足道的正則表達式技巧。用於匹配整個JavaScript函數定義的正則表達式?

例子:

一些JavaScript文件:

function wanted_foo(bar) { 
    ... 
    ... 
} 
function unwanted_foo(bar) { 
    ... 
    inner_foo { 
    ... 
    ... 
    } 
} 
function wanted_foo(bar) { 
    ... 
    ... 
    inner_foo { 
    ... 
    ... 
    } 
} 

這裏最明顯的問題是,我需要匹配的形式「function unwanted_foo(bar) { ... }」的事情,但我只需要匹配,直到最後函數的大括號,而不是另一個函數的下一個大括號。是否有一個簡單的正則表達式來做到這一點?

+0

http://rubular.com/是你的朋友 – olore 2012-07-14 02:49:57

回答

1

普通的正則表達式不能這樣做,因爲它們無法保留先前匹配的大括號的數量,因此無法找到最後一個大括號,但似乎許多實現的功能超出了普通的正則表達式,而Ruby是一種這些案件。

野兔是一對夫婦的參考,雖然它可能不是你所說的簡單。

  1. Matching braces in ruby with a character in front
  2. Backreferences
+0

感謝您的參考; 我試圖解決這樣的問題: 我有第一個{佔。我想搜索諸如(\ {。* \})*之類的東西,然後應該在最後}停止。 – 2012-07-14 00:31:22

0

一個 「絕招」 就是用正則表達式一起使用的計數器。

  • 初始化您的計數器爲0
  • 匹配的東西形式/^\s*function\s+\w+\(.*\)\s*\{的,當你發現這個模式,記住位置。
  • 當你匹配的模式,增加您的櫃檯
  • 現在匹配{}單獨和遞增或遞減取決於你發現你的櫃檯。
  • 堅持做下去,直到你的計數器爲0再次,那麼你應該已經找到了功能

希望這是對你有用?

+1

如果我最終做了這樣的事情,最好是使用String#index方法而不是使用Regex嗎?這可能是我要回溯到的,因爲我永遠無法匹配整個函數(雖然我已經非常接近包括除最後一個之外的所有內容);我也可以利用它並只刪除下一行儘管我擔心我沒有想到的測試案例。 – 2012-07-14 21:15:01