2011-11-02 50 views
0

感謝您的幫助!如何在功能中找到關鍵詞?

我有一些像jscripts:

var id="001"; 

var name="Jerry"; 
... 

function f1() { 
    ... 
    var qid="q1"; 
    ... 
} 

... 
var qid="aaabbb"; 
... 

function f2(){ 
    ... 
    var myid="q1"; 
    ... 
} 

... 

我想用正則表達式來獲取包含關鍵字「Q1」功能名。有沒有簡單的方法來做到這一點?

+0

你有一個字符串整個腳本? – Mikhail

+0

可能不能用正則表達式來完成。 :-(祝你好運! –

+0

不,沒有,編程語言是上下文無關的,正則表達式過程只是普通語言。 – Lachezar

回答

2

函數可以在JavaScript中的其他函數中定義,所以使用正則表達式試圖解決這個問題是不可能的。抱歉:-(

而且,問題是尚未什麼函數名,你在這樣的情況下,想要什麼?

function outerFunction(x, y) { 
    var innerFunction = function(z) { 
     return { 
      firstProperty: function() { 
       return "q1"; 
      } 
     }; 
    }; 
} 

見?三種不同的方式來聲明函數。你會如何創建一個解決方案?一般足以知道「正確的」(最相關)功能類似這樣的情況下,名

+0

爲什麼是這個downvoted? – IanNorton

+0

它被降低之前,我添加了代碼示例,但即使如此,我希望我知道。:-( –

+0

雖然你提出了一個有效的觀點,你有點嗡嗡聲殺了似乎downvote現在已經消失 – Mikhail

1

這裏,似乎爲我工作的正則表達式:

(function(.*)\(.*|\n*"q1") 

,這裏是我如何測試它:

http://rubular.com/r/APPNRR54oW

+0

這實際上太貪婪了,我會更新答案,當我罰款調整了這個 – Mikhail

+0

FJ打敗了我,他的實際工作 – Mikhail

2

嘗試以下操作:

/^function ([^(]*?)\((?=(?:[^\n]|\n[^}])*("q1")).*?^}/ms 

注意,當它是一個功能之外,這並不符合「Q1」,或者沒有「Q1」功能名內。對於每場比賽,第一組將是功能名稱,第二組將是「q1」。

看到它在行動:http://rubular.com/r/xQwro38DUO

這裏有一個解釋:

$regex = <<<END 
/
    ^function[ ]   # start looking when a line starts with function 
    ([^(]*?)\(   # capture the function name into group 1 
    (?=     # start a lookahead 
     (?:[^\n]|\n[^}])* # consume characters until a line starts with '}' 
     ("q1")    # or until we find "q1" (and place it in group 2) 
    )     # end lookahead 
    .*?^}    # consume until end of function (optional) 
/msx      # m and s flags for consuming multiple line handling 
END; 
+0

Thi s很棒,謝謝你使用rubular :-D我忘了lookahead。你不需要單獨分組'(「q1」)'。刪除'()'只會導致函數名稱。 – Mikhail

+0

嗨F.J,當q1從函數f1中移除時它不起作用。它獲得f1而不是f2: var id =「001」; var name =「Jerry」; ... function f1(){ ... var qid =「q2」; ... } ... var qid =「aaabbb」; ... function f2(){ ... var myid =「q1」; ... } ... –

+0

@JerryLu,它似乎是匹配f1的開始和f2的結尾。首先用「function」將字符串拆分爲一個函數數組,然後在每個單元格中搜索「q1」可能會更簡單一些。 – Mikhail