Git - 排除{}的彩色文字

12
我正在使用带有--color-words选项的git查看我的差异。在我的差异中,它显示我删除了。
<b>{{ljcount}}</b>&nbsp;&nbsp;&nbsp;Changes

然后我添加了:

<b>{{skills_limits}}</b>&nbsp;&nbsp;&nbsp;Changes

这比我想要的更大(我希望单词边界位于{}处)。我尝试使用--word-diff-regex进行调整,但我找不到适合的正则表达式。如何才能实现这个效果?

3个回答

12

来自 git help diff:

   --word-diff-regex=<regex>
       Use <regex> to decide what a word is, instead of considering runs of non-whitespace to be a word. Also implies
       --word-diff unless it was already enabled.
以下表达式将使一个单词成为任何字符和下划线的字符串,或者是任何非空格字符。
$ git diff --color-words --word-diff-regex='\\w+|[^[:space:]]'

1
你可能想使用 [^{} ],否则空格现在会被视为“单词”(或者甚至是 [^{}[:space:]],尽管我不确定这里使用的是哪种正则表达式引擎)。 - Lily Ballard
这实际上使情况变得更糟,它似乎将每个单独的字母都视为一个单词! - Casebash
在这种情况下,您希望将单词正则表达式设置为类似于这样的内容:--word-diff-regex='[A-z_][A-z_]*' - holygeek
@holygeek:--word-diff-regex ='[A-z_]+'是等效的。好的,我之前的错误是使用*而不是+。然而,这会导致其他字符(例如逗号)从dif中隐藏起来。Git建议添加| [^ [: space:]]以确保任何单个非空格字符都可以被视为一个单词。 - Casebash
1
如果我删除\\w+也可以得到相同的输出,例如--word-diff-regex='\\w+|[^[:space:]]'--word-diff-regex='[^[:space:]]'。此外,修改此答案是不合适的,因为这使得无法跟进评论或确定OP接受了哪个版本。 - EoghanM
显示剩余2条评论

9

由于您已经使用了--color-words,因此您不需要单独提供--word-diff-regex选项,第一个选项接受正则表达式:

--color-words[=<regex>]

Equivalent to --word-diff=color plus --word-diff-regex=<regex> (if a regex was specified).

我推荐使用以下正则表达式,它在我这里效果很好:
$ git diff --color-words='\w+|.'

2
如果您正在使用--color-words[=<regex>],请确保使用Git 2.32(2021年第二季度)或更高版本:单词差异模式已经被教导,可以更好地与可以匹配空字符串的单词正则表达式配合使用。
请参见提交0324e8f(2021年5月4日),作者为Phillip Wood(phillipwood
(由Junio C Hamano -- gitster --提交65c1891中合并,2021年5月14日)

单词差异:处理零长度匹配

签名:Phillip Wood

如果find_word_boundaries()遇到了零长度匹配(可能是由于匹配换行符或在正则表达式中使用'*'而不是'+'引起的),我们停止将输入拆分为单词,这会生成不准确的差异。
要解决这个问题,在出现零长度匹配时增加起始点并尝试新的匹配。
这是安全的,因为posix正则表达式总是返回最长可用匹配,所以零长度匹配意味着当前位置没有更长的匹配可用。
提交bf82940(“color-words: enable REG_NEWLINE to help user”,2009-01-17,Git v1.6.2-rc0 - merge)防止在否定字符类中匹配换行符,但用户仍然可以在正则表达式中有一个显式的换行符匹配,这可能导致零长度匹配。
有人可能会认为有显式的换行符匹配或使用'*'而不是'+'是用户错误,但似乎更好的方法是解决它们而不是产生不准确的差异。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接