Mx align-regexp删除文本?

5 regex emacs

这是我正在尝试格式化的示例文本:

(9 12 19 38 0 -39 -20 -13 -10)
(7 9 14 29 0 -30 -15 -10 -8)
(4 6 9 19 0 -20 -10 -7 -5)
(2 3 4 9 0 -10 -5 -4 -3)
(0 0 0 0 0 0 0 0 0)
(-3 -4 -5 -10 0 9 4 3 2)
(-5 -7 -10 -20 0 19 9 6 4)
(-8 -10 -15 -30 0 29 14 9 7)
(-10 -13 -20 -39 0 38 19 12 9)
Run Code Online (Sandbox Code Playgroud)

我希望每列在数字上对齐(即如果有减号,则添加额外的空格).

如果我这样做: C-uM-xalign-regexpRET\([[:digit:]]+\)RETRETRETy

我明白了:

(9  12 19 38 0 -3 -2 -1 -1)
(7  9  14 29 0 -3 -1 -1 -8)
(4  6  9  19 0 -2 -1 -7 -5)
(2  3  4  9  0 -1 -5 -4 -3)
(0  0  0  0  0 0  0  0  0 )
(-3 -4 -5 -1 0 9  4  3  2 )
(-5 -7 -1 -2 0 19 9  6  4 )
(-8 -1 -1 -3 0 29 14 9  7 )
(-1 -1 -2 -3 0 38 19 12 9 )
Run Code Online (Sandbox Code Playgroud)

这非常接近,但不是我想要的.

如果我尝试修改表达式以包含减号,如下所示: \(-?[[:digit:]]+\)

然后我明白了:

(9 1 1 3 0 - - - -)
(7 9 1 2 0 - - - -)
(4 6 9 1 0 - - - -)
(2 3 4 9 0 - - - -)
(0 0 0 0 0 0 0 0 0)
(- - - - 0 9 4 3 2)
(- - - - 0 1 9 6 4)
(- - - - 0 2 1 9 7)
(- - - - 0 3 1 1 9)
Run Code Online (Sandbox Code Playgroud)

这是一个错误,还是有什么我不知道的?

Sea*_*ean 3

与指定组(通常为组 1)匹配的文本被扩展或收缩,因此组中的非空白字符将被删除,如您所见。除非启用了调整,这通过向 提供组号来指示align-regexp

C-uM-xalign-regexpRET\(\s-*-?\)[0-9]+RET-1RETRETy

如果需要,您可以通过将数字包含在匹配组中来对齐每个数字的个位上的列:

C-uM-xalign-regexpRET\(\s-*-?[0-9]+\)RET-1RETRETy

无论哪种情况,都会在每个左括号后插入一个额外的空格。我没有看到任何方法可以避免align-regexp这样做,但如果您经常这样做,您可以将其包装在执行align-regexp, 然后将正则表达式替换"^( ""("原始区域中的所有位置的命令中。