考虑到行和列范围的最终工作解决方案:
(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) )
下面的两个答案都非常有帮助;我现在对这个系统有了更好的理解。
摘要:我的正则表达式可以匹配输出字符串,但不能在compile-error-regexp-alist-alist 中匹配我的编译输出中的错误。
我发现编译模式正则表达式有点令人困惑。我已经编写了一个正则表达式,我知道它可以使用重建器和 compile.el 中的原始正则表达式处理我的错误字符串。
40>f:\Projects\dev\source\Helper.cs(37,22,37,45): 错误 CS1061: 'foo.bar' 不包含 'function' 的定义并且没有扩展方法 'method' 接受可以找到“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)
显然,我只是想找到输出的第一行/列对。(我很惊讶编译器输出的是 4 个数字而不是 2 个,但无论如何。)
如果我们查看 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 正则表达式并进入子表达式模式,0 匹配整个匹配字符串,1 匹配文件名和路径,2 匹配行号。通过查看文档(当我执行 Mx describe-variable 时),似乎它只关心子表达式在主表达式中的位置。无论哪种方式,我显然都误解了一些东西。
我还尝试修改官方 csharp.el 正则表达式来处理额外的两个数字,但没有运气。
(编辑,稍微修正了示例,更新了 csharp 正则表达式)