这是我关于stackoverflow的第一篇文章,所以请温柔地对待我......
我还在学习正则表达式 - 主要是因为我终于发现它们有多么有用,这部分是通过使用Sublime Text 2.所以这是Perl正则表达式(我相信)
我已经在这个和其他网站上搜索过,但我现在真的被卡住了。也许我正在尝试做一些无法做到的事情
我想找到一个正则表达式(模式),它可以让我找到包含给定变量或方法调用的函数或方法或过程等。
我尝试了很多表达式,但他们似乎已经完成了部分工作,但并非一直如此。特别是在Javascript中搜索时,我会选择多个函数声明,而不是最接近我正在寻找的调用/变量的声明。
例如: 我正在寻找调用方法的函数save data() 我从这个优秀的网站上了解到,我可以用(?s)切换。包括换行符
function.*(?=(?s).*?savedata\(\))
然而,这将找到单词function的第一个实例,然后找到所有文本,包括savedata()
如果有多个程序,那么它将从下一个函数开始并重复,直到它再次到达savedata()
function(?s).*?savedata\(\) does something similar
我试过让它忽略第二个功能(我相信),使用类似的东西:
function(?s).*?(?:(?!function).*?)*savedata\(\)
但这不起作用。
我做了一些前瞻性的调查并向后看,但要么我做错了(极有可能),要么他们不是正确的事。
总结(我猜),我如何向后,从给定的单词到最近出现的不同单词。
目前我正在使用它搜索一些javascript文件来尝试理解结构/调用等但最终我希望在c#文件和一些vb.net文件上使用
非常感谢提前
感谢快速回复并抱歉没有添加示例代码块 - 我现在会做(已修改但仍足以显示问题)
如果我有一个简单的javascript块,如下所示:
function a_CellClickHandler(gridName, cellId, button){
var stuffhappenshere;
var and here;
if(something or other){
if (anothertest) {
event.returnValue=false;
event.cancelBubble=true;
return true;
}
else{
event.returnValue=false;
event.cancelBubble=true;
return true;
}
}
}
function a_DblClickHandler(gridName, cellId){
var userRow = rowfromsomewhere;
var userCell = cellfromsomewhereelse;
//this will need to save the local data before allowing any inserts to ensure that they are inserted in the correct place
if (checkforarangeofthings){
if (differenttest) {
InsSeqNum = insertnumbervalue;
InsRowID = arow.getValue()
blnWasInsert = true;
blnWasDoubleClick = true;
SaveData();
}
}
}
对此运行正则表达式 - 包括第二个被识别为应该工作的Sublime Text 2将选择从第一个函数到SaveData()的所有内容
在这种情况下,我希望能够只使用dblClickHandler - 而不是两者。
希望这段代码片段能够增加一些清晰度并抱歉原本不发布,因为我希望标准代码文件就足够了。
答案 0 :(得分:0)
这个正则表达式将找到包含SaveData方法的每个Javascript函数:
(?<=[\r\n])([\t ]*+)function[^\r\n]*+[\r\n]++(?:(?!\1\})[^\r\n]*+[\r\n]++)*?[^\r\n]*?\bSaveData\(\)
它将匹配函数中的所有行,包括包含SaveData方法的第一行。
<强>警告:强>
<强>解释强>
(?<=[\r\n]) Start at the beginning of a line
([\t ]*+) Capture the indentation of that line in Capture Group 1
function[^\r\n]*+[\r\n]++ Match the rest of the declaration line of the function
(?:(?!\1\})[^\r\n]*+[\r\n]++)*? Match more lines (lazily) which are not the last line of the function, until:
[^\r\n]*?\bSaveData\(\) Match the first line of the function containing the SaveData method call
注意: *+
和++
是占有量词,仅用于加速执行。
修改强> 修复了正则表达式的两个小问题 修改强> 修复了正则表达式的另一个小问题。