2013-09-30 3 views
0

Я пытаюсь разобрать некоторые js-файлы (ExtJS) и найти все зависимости, которые используются классом в этом файле.Анализ текстового файла с регулярным выражением

Sample файл выглядит расслоение плотной, как так:

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.]*['"], я тестировался это here, но я хочу только получить часть между кавычками или двойными кавычками (можно ли это также проверить? Чтобы мы могли исключить те, у кого есть первая цитата и вторая двойная кавычка).

RegEx не может быть быстрее, но я не знаю, как еще я мог это сделать.
Любые советы приветствуются.

ответ

3

Вы можете просто использовать группу захвата; вы заключаете требуемую часть между скобками:

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

И доступом к ним через .Groups[1].Value


EDIT: По запросу:

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

С этим, вы можете получить доступ к захваченному группа с .Groups["inside"].Value

+0

Thans такой быстрый ответ. Могу ли я добавить название группы в это регулярное выражение и убедиться, что оно начинается и заканчивается квотами или doubleqoutas, как в ответе @ Армана? – Misiu

+0

@ Misiu Конечно, отредактировал мой ответ для этой цели. – Jerry

+0

Спасибо Джерри :) Еще одна вещь. Сейчас я сканирую файл по строкам. Могу ли я использовать один и тот же RegEx для одновременного сканирования всего файла? Вероятно, это сэкономит некоторое время. – Misiu

3
extend\s*:\s?("|')(.*)\1 

\1 - это ссылка на все, что зафиксировано скобками в ("|'), поэтому оно приведет к правильному совпадению кавычек.

В этом случае соответствует части (что вы хотите) ветра в Groups[2].Value

Кроме того, просто стилистическое предложение: не используйте [ ]* для согласования пространства, эти группировки скобки выглядят слишком запутанное, когда пусто. Простой \s* легче читать и понимать.

+0

писал это, когда увидел, что вы его разместили. Самый элегантный ответ на проблему. –

1

Вам не хватает группы захвата.Обратите внимание на скобки вокруг [a-zA-Z.]*

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

Для реализации этого попробовать:

var result = from Match match in Regex.Matches(line, "extend([ ]*):[ ]*['"]([a-zA-Z.]*)['"]") 
     select match.ToString(); 
Смежные вопросы