【问题标题】:Parse text file with regex使用正则表达式解析文本文件
【发布时间】:2013-09-30 19:35:37
【问题描述】:

我正在尝试解析一些 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);
            }
        }
    }
}

但这也会返回 cmets 和其他不必要的东西。 我的想法是使用 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.]*['"],我已经对其进行了测试here,但我只想获得引号或双引号之间的部分(这也可以验证吗?这样我们就可以排除那些带有第一个引号和第二个双引号)。

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

【问题讨论】:

    标签: c# .net regex


    【解决方案1】:

    您可以简单地使用捕获组;你把需要的部分用括号括起来:

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

    您可以通过.Groups[1].Value访问它们


    编辑:根据要求:

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

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

    【讨论】:

    • 感谢这么快的回复。我可以将组名添加到该正则表达式并确保它以配额或 doubleqoutas 开头和结尾,就像在@Arman 的答案中一样?
    • 谢谢杰瑞 :) 还有一件事。现在我正在逐行扫描文件。我可以使用同一个 RegEx 一次扫描整个文件吗?这可能会节省一些时间。
    【解决方案2】:
    extend\s*:\s?("|')(.*)\1
    

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

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

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

    【讨论】:

    • 在写这篇文章的时候看到你发了。最优雅的问题答案。
    【解决方案3】:

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

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

    要实现这个尝试:

    var result = from Match match in Regex.Matches(line, "extend([ ]*):[ ]*['"]([a-zA-Z.]*)['"]") 
             select match.ToString();
    

    【讨论】:

      猜你喜欢
      • 2013-08-13
      • 1970-01-01
      • 2016-04-27
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      相关资源
      最近更新 更多