如何使用Tabular仅在Vim中匹配first =,忽略==,< =,> =,!=,/ =等?

时间:2014-04-14 22:53:18

标签: regex vim variable-assignment tabular

我尝试使用Tablular来匹配行中的第一个赋值运算符,忽略行中有=的其他运算符(例如==<=>=/=!=~=等。)

迄今为止我得到的最好成绩如下:

:Tabularize /\zs[=<>/!]\@<!=[=<>/!]\@!\ze/<CR>

这与=匹配,确保其中任何一方都不是=<>,{{1}之一}或/

如果我在该行中只有一个赋值,则可以使用,例如:

!

变为

one = uno
two = dos
three = tres

但是,如果我在该行中有多个作业,例如:

one   = uno
two   = dos
three = tres

然后我最终得到(注意对齐的第二组等号):

one = uno = alpha
two = dos = beta
three = tres = gamma

我真正想要的只是(注意第二组等号不对齐):

one   = uno  = alpha
two   = dos  = beta
three = tres = gamma

我真正关注的是Tablular只匹配上面的第一个赋值运算符,注意不要匹配其中也有one = uno = alpha two = dos = beta three = tres = gamma 的其他运算符。

我需要对模式=做些什么来实现这一目标?

3 个答案:

答案 0 :(得分:2)

我认为您只需要在正则表达式的末尾添加.*(而不是\ze

:Tabularize /\zs[=<>/!]\@<!=[=<>/!]\@!.*/

只包括该行的其余部分作为分隔符的一部分。

答案 1 :(得分:2)

有一些常见的:Tabular成语可以派上用场:

  • 使用\zs在模式中的特定点开始匹配
  • 使用.*结束模式以使用该行的其余部分以防止更多匹配

我赞扬使用负面预测和后视,但我认为我们可以让这更简单:

:Tabularize/\s\zs=\s.*/

这假设您的运算符两侧都有空格(假设您的代码格式很好)

如需更多帮助,请参阅:

:h /\zs
:h tabular-walkthrough

答案 2 :(得分:0)

:help tabular的“演练”部分中有一个示例:

But, what if you only wanted to act on the first comma on the line, rather than
all of the commas on the line?  Let's say we want everything before the first
comma right aligned, then the comma, then everything after the comma left
aligned:

    abc,def,ghi
    a,b
    a,b,c

    :Tabularize /^[^,]*\zs,/r0c0l0

    abc,def,ghi
      a,b
      a,b,c

Here, we used a Vim regex that would only match the first comma on the line.
It matches the beginning of the line, followed by all the non-comma characters
up to the first comma, and then forgets about what it matched so far and
pretends that the match starts exactly at the comma.

您可以轻松适应您的需求:

:Tabularize /^[^=]*\zs=