2015-01-07 3 views
1

Окончательный рабочий раствор, который принимает во внимание строке и колонке диапазонов:написания регулярных выражений

(csharp 
"^ *\\(?:[0-9]+>\\)*\\(\\(?:[a-zA-Z]:\\)?[^:(\t\n]+\\)(\\([0-9]+\\),\\([0-9]+\\),\\([0-9]+\\),\\([0-9]+\\)) *\: \\(error\\|warning\\) *CS[0-9]+:)" 
1 (2 . 4) (3 . 5)) 

Оба ответа ниже были невероятно полезны; Теперь я понимаю систему намного лучше.


Резюме: мои регэксп работать, чтобы соответствовать выходным строкам, но не работает в компиляции ошибки-регулярные выражения-ALIST-крене, чтобы соответствовать ошибкам в моем выходе компиляции.

Я нахожу компиляцию в режиме регулярных выражений несколько запутанной. Я написал регулярное выражение, которое, как мне известно, работает в моей строке ошибок, используя rebuilder и исходные регулярные выражения, которые находятся в файле compile.el.

40> F: \ Projects \ DEV \ источник \ Helper.cs (37,22,37,45): ошибка CS1061: 'foo.bar' не содержит определение для 'функции' и без расширения метод «метод» принимая первый аргумент типа «foo.bar» может быть найден (? вы пропали без вести с помощью директивы или ссылка на сборку)

и вот мое регулярное выражение:

(pushnew '(csharp 
"^ *\\(?:[0-9]+>\\)*\\(\\(?:[a-zA-Z]:\\)?[^:(\t\n]+\\)(\\([0-9]+\\),\\([0-9]+\\),[0-9]+,[0-9]+) *\: \\(?:error *CS[0-9]+:\\)" 
2 3) 
    compilation-error-regexp-alist-alist) 

Очевидно , Я просто пытаюсь добраться до первой строки/столбца, которая выводится. (Я удивлен, что компилятор выводит 4 цифры вместо двух, но все.)

Если мы посмотрим на EDG-1 регулярное выражение в compile.el:

(edg-1 
"^\\([^ \n]+\\)(\\([0-9]+\\)): \\(?:error\\|warnin\\(g\\)\\|remar\\(k\\)\\)" 
1 2 nil (3 . 4)) 

Так что я думаю, где я «Мы смущены тем, как передаются аргументы. В edg-1, откуда взялись 3 и 4? Думаю, они не соответствуют группам захвата? Если я запустил edg-1 regexp через повторный построитель на хорошо сформированном сообщении об ошибке и ввел режим подвыражения, 0 соответствует всей строке соответствия, 1 соответствует имени файла и пути, а 2 соответствует номеру строки. От взгляда на документацию (когда я делаю M-x описать-переменную), кажется, что она просто заботится о том, какое место подвыражения находятся в главном выражении. В любом случае, я явно что-то недопонимаю.

Я также пробовал модифицировать регулярное выражение csharp.el для обработки лишних двух чисел, но не повезло.

(Edit, немного исправили пример, обновил Csharp регулярному_выражению)

+0

Некоторые странные правила цитирования. Как делается интерполяция? – sln

+0

Рад, что у вас это работает. Последний текст '\\)' "в вашем конечном регулярном выражении, вероятно, не нужен, приведет к неуравновешенной ошибке группы захвата. – sln

+0

@sln Вы почти наверняка правы, и я понятия не имею, почему система не жаловалась на это. – RealityMonster

ответ

0

Найдено некоторую информацию по этому вопросу.

Эта страница имеет упрощенный объяснение:
http://praveen.kumar.in/2011/03/09/making-gnu-emacs-detect-custom-error-messages-a-maven-example/

Цитата со страницы -

"Each elt has the form (REGEXP FILE [LINE COLUMN TYPE HYPERLINK 
HIGHLIGHT...]). If REGEXP matches, the FILE'th subexpression 
gives the file name, and the LINE'th subexpression gives the line 
number. The COLUMN'th subexpression gives the column number on 
that line" 

Так выглядит формат является чем-то вроде этого:

(REGEXP FILE [LINE COLUMN TYPE HYPERLINK HIGHLIGHT...]) 

Глядя на regex снова, он выглядит как модифицированный BRE.

^     # BOS 
\([^ \n]+ \)  # Group 1 

(     # Literal '(' 
\([0-9]+ \)  # Group 2 
)     # Literal ')' 

: [ ] 

\(?: 
     error 
    \| 
     warnin\(g\) # Group 3 
    \| 
     remar\(k\)  # Group 4 
\) 

Здесь EDG-1

(edg-1 
"^\\([^ \n]+\\)(\\([0-9]+\\)): \\(?:error\\|warnin\\(g\\)\\|remar\\(k\\)\\)" 
1 2 nil (3 . 4)) 

Где

"^\\([^ \n]+\\)(\\([0-9]+\\)): \\(?:error\\|warnin\\(g\\)\\|remar\\(k\\)\\)" 
REGEXP ^^^^^^^^ 

1  2 nil (3 . 4) 
^ ^ ^ ^^^^^ 
FILE LINE COLUMN TYPE 

"TYPE is 2 or nil for a real error or 1 for warning or 0 for info. 
TYPE can also be of the form (WARNING . INFO). In that case this 
will be equivalent to 1 if the WARNING'th subexpression matched 
or else equivalent to 0 if the INFO'th subexpression matched." 

Так, ТИП имеет такой вид (ВНИМАНИЕ. ИНФОРМАЦИЯ)

In the regex, 
if capture group 3 matched (ie. warnin\(g\)) it is equivalent to a warning. 
If capture group 4 matched (ie. remar\(k\)) it is equivalent to info. 
One of these will match. 

CSharp элемент Информация

Глядя на ваш csharp элемент

"^ *\\(?:[0-9]+>\\)?\\(\\(?:[a-zA-Z]:\\)?[^:(\t\n]+\\)(\\([0-9]+\\),\\([0-9]+\\),[0-9]+,[0-9]+) *\: \\(?:error *CS[0-9]+:\\)" 
2 3 4 

и ваш регулярное выражение (ниже) на самом деле не имеет группу захвата 4 в нем.
Итак, ваш файл построчно КОЛОНКА 2 3 4
, вероятно, должен быть 1 2 3

Вот ваш регулярное выражение, как его двигатель видеть все -

^
[ ]* 
\(?: 
     [0-9]+ > 
\)? 
\(       # Group 1 
     \(?: 
      [a-zA-Z] : 
     \)? 
     [^:(\t\n]+ 
\) 
(       # Literal '(' 
     \([0-9]+ \)    # Group 2 
     , 
     \([0-9]+ \)    # Group 3 
     , 
     [0-9]+ 
     , 
     [0-9]+ 
)        # Literal ')' 
[ ]* \: [ ] 
\(?: 
     error [ ]* CS [0-9]+ : 
\) 
+0

Интересно, это имеет смысл. Я не супер потрясающе с регулярными выражениями, поэтому понимание того, как они предназначены для чтения, - это некоторая помощь. Я попытаюсь сделать тот же анализ в своем регулярном выражении csharp. Спасибо! – RealityMonster

+1

@RealityMonster - Обновлено с новой информацией. Я раньше был на пути. Думаю, я нашел решение для вас, относящееся к полю _TYPE_. Все это - разобрать сообщения компилятора с предупреждением/ошибкой. Имеет смысл, что они попытаются упаковать пользовательский контроль и параметры форматирования в командах. Как и printf(). – sln

+0

Я тоже читал документ, и я пришел к тем же выводам, но все равно не работает. Я пытался упростить вещи и просто введите имя файла и номер строки в системе и игнорировать такие вещи, как столбцы и тип. Исходя из этого, мое csharp regexp должно пройти в 2 для имени файла (потому что \ (?: [0-9] +> \) фиксирует первое место) и 3 для номера строки, но оно все еще не совпадает. (Я также попробовал 1 для имени файла и 2 для linenumber в случае, если есть правила пропуска, которые мне нужно учитывать. Не повезло и там.) – RealityMonster

1

Мой хрустальный шар придумал странное объяснение: compilation-error-regexp-alist-alist это всего лишь набор правил соответствия, но он не говорит, какие правила использовать. Поэтому вам нужно добавить csharp в compilation-error-regexp-alist, если вы хотите использовать свое новое правило.

Что касается значения (3 . 4), см. C-h v compilation-error-regexp-alist.

+0

Я пошел, чтобы проверить, что вы сказали, и я ДУМАЮ, что добавил бы кршарп регулярного выражения в список, но я этого не сделал. Но мое регулярное выражение было не совсем правильным для начала. Итак, между вами и sln, моя проблема решена. Благодаря! – RealityMonster

Смежные вопросы