行と列の範囲を考慮した最終的な実用的なソリューション:
(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) )
以下の両方の回答は非常に役に立ちました。システムの理解が深まりました。
要約: 私の正規表現は出力文字列と一致するように機能しますが、コンパイル出力のエラーと一致するように compilation-error-regexp-alist-alist では機能しません。
コンパイル モードの正規表現が少しわかりにくいと思います。私は、エラー文字列に対してリビルドと compile.el にある元の正規表現を使用して動作することがわかっている正規表現を作成しました。
40>f:\Projects\dev\source\Helper.cs(37,22,37,45): エラー CS1061: 'foo.bar' には '関数' の定義が含まれておらず、拡張メソッド 'メソッド' が受け入れられませんタイプ 'foo.bar' の最初の引数が見つかりました (using ディレクティブまたはアセンブリ参照がありませんか?)
そして、ここに私の正規表現があります:
(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)
明らかに、出力される最初の行/列のペアに到達しようとしているだけです。(コンパイラが 2 つではなく 4 つの数値を出力していることに驚いていますが、何でも構いません。)
compile.el の edg-1 正規表現を見ると、次のようになります。
(edg-1
"^\\([^ \n]+\\)(\\([0-9]+\\)): \\(?:error\\|warnin\\(g\\)\\|remar\\(k\\)\\)"
1 2 nil (3 . 4))
だから私が混乱しているのは、引数がどのように渡されるかということだと思います。edg-1 では、3 と 4 はどこから来ていますか? 彼らは捕獲グループに対応していないと思いますか?整形式のエラー メッセージに対して re-builder を介して edg-1 regexp を実行し、部分式モードに入ると、0 は一致する文字列全体に一致し、1 はファイル名とパスに一致し、2 は行番号に一致します。ドキュメンテーションを見ると (Mx describe-variable を実行したとき)、サブ式がメイン式のどの場所にあるかだけを気にしているように見えます。いずれにせよ、私は明らかに何かを誤解しています。
また、公式の csharp.el 正規表現を変更して余分な 2 つの数値を処理しようとしましたが、うまくいきませんでした。
(編集、例を少し修正、csharp 正規表現を更新)