最佳解决方案到目前为止,我给出了一个文本块,它找到了那些有参数的方法,还有带参数键的函数,如:“get:function(key)”。
public class JavaScriptMethodFinder
{
static readonly string pattern = @"(?<=\s(?<Begin>[a-zA-Z_][a-zA-Z0-9_]*?)\(|\G)\s*((['""]).+?(?<!\\)\2|\{[^}]+\}|[^,;'""(){}\)]+)\s*(?:,|(?<IsEnd>\)))";
private static readonly Regex RegEx = new Regex(pattern, RegexOptions.Compiled);
public IEnumerable<dynamic> Find(string text)
{
var t = RegEx.Matches(text);
dynamic current = null;
bool isBegin;
foreach (Match item in t)
{
if (isBegin = (item.Groups["Begin"].Value != string.Empty))
{
current = new ExpandoObject();
current.MethodName = item.Groups["Begin"].Value;
current.Parameters = new List<string>();
current.Parameters.Add(item.Groups[1].Value);
}else
current.Parameters.Add(item.Groups[1].Value);
if (item.Groups["IsEnd"].Value != string.Empty)
{
isBegin = false;
if(!(item.Groups["Begin"].Value != string.Empty))
current.Parameters.Add(item.Groups[1].Value);
yield return current;
}
}
}
}
我想找到方法及其变量。举两个例子。
function loadMarkers(markers)
{
markers.push(
new Marker(
"Hdsf",
40.261330438503,
10.4877055287361,
"some text"
)
);
}
var block = new AnotherMethod('literal', 'literal', {"key":0,"key":14962,"key":false,"key":2});
到目前为止,我已在此处测试过:http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx
(?<=Marker\(|\G)\s*((?<name>['""]).+?(?<!\\)\2|\{[^}]+\}|[^,;'""(){}\)]+)\s*(?:,|\))
找到5场比赛: “Hdsf”,有2组: “Hdsf” “ 40.261330438503,共有2组: 40.261330438503 10.4877055287361,共有2组: 10.4877055287361 “一些文字”)有两组: “一些文字” “ )有两组:
(?<=AnotherMethod\(|\G)\s*((?<name>['""]).+?(?<!\\)\2|\{[^}]+\}|[^,;'""(){}\)]+)\s*(?:,|\))
找到3场比赛: 'literal',有2组: '文字' ' (名称) 'literal',有2组: '文字' ' (名称) {“key”:0,“key”:14962,“key”:false,“key”:2})有2组: { “键”:0, “钥匙”:14962, “钥匙”:假, “密钥”:2} (名称)
我想将它组合起来,以便我有一个表达式
因此,当我扫描包含两种情况的页面时,我将得到两个匹配女巫 第一个捕获是方法名称,然后以下是参数。
我一直试图修改我已经拥有的东西,但它与LookBehind的东西很复杂,让我理解它。
答案 0 :(得分:1)
正则表达式对于此类项目来说是一个非常有问题的方法。你有没有看过使用像Rhino这样的真正的JavaScript解析器/编译器?这将让您充分了解JavaScript语法“免费”以及有意义地浏览源代码的能力。