2011-11-02 45 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