Окончательный рабочий раствор, который принимает во внимание строке и колонке диапазонов:написания регулярных выражений
(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 регулярному_выражению)
Некоторые странные правила цитирования. Как делается интерполяция? – sln
Рад, что у вас это работает. Последний текст '\\)' "в вашем конечном регулярном выражении, вероятно, не нужен, приведет к неуравновешенной ошибке группы захвата. – sln
@sln Вы почти наверняка правы, и я понятия не имею, почему система не жаловалась на это. – RealityMonster