1

我正在尝试解析一些 js 文件(ExtJS)并找到该文件中类使用的所有依赖项。

示例 js 文件如下所示:

Ext.define('Pandora.controller.Station', {
    extend: 'Ext.app.Controller',

    refs: [{
        ref: 'stationsList',
        selector: 'stationslist'
    }],

    stores: ['Stations', 'RecentSongs'],
    ...

我想要得到的是Ext.app.Controller.

使用我的代码,我可以获得所有包含extend

public void ReadAndFilter(string path)
{
    using (var reader = new StreamReader(path))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            if (line.Contains("extend"))
            {
                listBox2.Items.Add(line);
            }
        }
    }
}

但这也会返回评论和其他不必要的东西。我的想法是使用 RegEx 查找所有字符串。

我的问题是,有时行在扩展前后有一些空格。
以下是一些可以在 js 文件中找到的示例:

extend          : 'Ext.AbstractPlugin',
extend: 'Ext.util.Observable',
@extends Sch.feature.AbstractTimeSpan
extend      : "Sch.feature.AbstractTimeSpan",
extend              : "Sch.plugin.Lines",
extend : "Sch.util.DragTracker",

在此运行 RegEx 应该返回:

Ext.AbstractPlugin
Ext.util.Observable
Sch.feature.AbstractTimeSpan
Sch.plugin.Lines
Sch.util.DragTracker

这是我的尝试:extend[ ]*:[ ]*['"][a-zA-Z.]*['"],我在这里测试过,但我只想得到引号或双引号之间的部分(这也可以验证吗?这样我们就可以排除带有第一个引号和第二个双引号的那些)。

RegEx 可能不是最快的,但我不知道我还能如何做到这一点。
欢迎任何建议。

4

3 回答 3

4

您可以简单地使用捕获组;您将所需的部分括在括号之间:

extend[ ]*:[ ]*['"]([a-zA-Z.]*)['"]

你通过.Groups[1].Value


编辑:根据要求:

extend *: *('|")(?<inside>[a-zA-Z.]*)\1

有了这个,您可以访问捕获的组.Groups["inside"].Value

于 2013-09-30T19:39:11.637 回答
4
extend\s*:\s?("|')(.*)\1

\1是对 中的括号捕获的任何内容的引用("|'),因此它将强制引号正确匹配。

在这种情况下,匹配的部分(你想要的)结束了Groups[2].Value

另外,只是一个风格建议:不要[ ]*用于匹配空格,这些分组括号在为空时看起来太混乱了。简单\s*易读易懂。

于 2013-09-30T19:42:46.507 回答
2

您只缺少一个捕获组。注意周围的括号[a-zA-Z.]*

extend([ ]*):[ ]*['"]([a-zA-Z.]*)['"]

要实现此尝试:

var result = from Match match in Regex.Matches(line, "extend([ ]*):[ ]*['"]([a-zA-Z.]*)['"]") 
         select match.ToString();
于 2013-09-30T19:43:45.400 回答