【问题标题】:Git - Color words excluding {}Git - 不包括 {} 的颜色词
【发布时间】:2011-12-13 00:52:20
【问题描述】:

我正在使用带有 --color-words 的 git 来查看我的差异。在我的差异中,它表明我删除了

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

我补充说:

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

这比我希望的要大(我希望单词边界位于 {})。我尝试使用--word-diff-regex,但我找不到使其工作的正则表达式。我怎样才能达到这个结果?

【问题讨论】:

    标签: regex git


    【解决方案1】:

    来自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:]]'
    

    【讨论】:

    • 你可能想使用[^{} ],否则空格现在被认为是“单词”(甚至[^{}[:space:]],虽然我不确定这里使用的是什么正则表达式引擎)
    • 这实际上使情况变得更糟,它似乎将每个单独的字母视为一个单词!
    • 在这种情况下,您想将您的单词正则表达式设置为:--word-diff-regex='[A-z_][A-z_]*'
    • @holygeek: --word-diff-regex='[A-z_]+' 是等价的。好的,我之前的错误是使用 * 而不是 +。但是,这会导致其他字符,例如逗号从差异中隐藏。 Git 建议添加 |[^[:space:]] 以确保任何单个非空白字符都可以算作一个单词。
    • 如果我放弃\\w+,我会得到相同的输出,例如--word-diff-regex='\\w+|[^[:space:]]' vs. --word-diff-regex='[^[:space:]]' 另外,这个答案的编辑是不合适的,因为它使得无法遵循 cmets,或者弄清楚 OP 接受了哪个版本。
    【解决方案2】:

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

    --color-words[=<regex>]
    

    相当于--word-diff=color加上--word-diff-regex=&lt;regex&gt; (如果指定了正则表达式)。

    一个特别适合我的正则表达式是:

    $ git diff --color-words='\w+|.'
    

    【讨论】:

      【解决方案3】:

      如果您使用的是--color-words[=&lt;regex&gt;],请确保使用 Git 2.32(2021 年第二季度)或更新版本:word-diff 模式已被教导使用可以匹配空字符串的单词正则表达式更好地工作。

      参见 Phillip Wood (phillipwood)commit 0324e8f(2021 年 5 月 4 日)。
      (由 Junio C Hamano -- gitster -- 合并到 commit 65c1891,2021 年 5 月 14 日)

      word diff:处理零长度匹配

      签字人:Phillip Wood

      如果find_word_boundaries() 遇到零长度匹配(这可能是由于匹配换行符或在正则表达式中使用'*'而不是'+'),我们停止将输入拆分为单词,这会产生不准确差异。
      要解决此问题,请在零长度匹配时增加起点并尝试新匹配。
      这是安全的,因为 posix 正则表达式总是返回最长的可用匹配,因此零长度匹配意味着从当前位置不再有可用的匹配。

      Commit bf82940 ("color-words: enable REG_NEWLINE to help user", 2009-01-17, Git v1.6.2-rc0 -- merge) 阻止在否定字符类中匹配换行符,但它是用户仍有可能在正则表达式中进行显式换行匹配,这可能导致零长度匹配。

      有人可能会争辩说,有明确的换行符匹配或使用“*”而不是“+”是用户错误,但解决它们似乎比产生不准确的差异更好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-11
        • 1970-01-01
        相关资源
        最近更新 更多