正则表达式 - 在文本中查找javascript方法及其变量

时间:2011-08-02 23:37:41

标签: java regex methods

最佳解决方案到目前为止,我给出了一个文本块,它找到了那些有参数的方法,还有带参数键的函数,如:“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}  (名称)

我想将它组合起来,以便我有一个表达式

  • 匹配≤(方法名)GT;
    • 组:参数
    • 组:参数
    • 组:参数
  • 匹配≤(方法名)GT;
    • 组:参数
    • 组:参数
    • 组:参数

因此,当我扫描包含两种情况的页面时,我将得到两个匹配女巫 第一个捕获是方法名称,然后以下是参数。

我一直试图修改我已经拥有的东西,但它与LookBehind的东西很复杂,让我理解它。

1 个答案:

答案 0 :(得分:1)

正则表达式对于此类项目来说是一个非常有问题的方法。你有没有看过使用像Rhino这样的真正的JavaScript解析器/编译器?这将让您充分了解JavaScript语法“免费”以及有意义地浏览源代码的能力。