如何匹配除选项卡之外的所有内容(对于 git diff --word-diff-regex)

Rat*_*met 5 regex git posix

我正在尝试使用git diff --word-diff-regex[1]进行 word-diff 。基本上,此正则表达式的任何匹配都被视为一个单词。我的文档是一个制表符分隔的文本文件,每列可能包含空格字符。所以,我尝试使用否定字符类,--word-diff-regex='[^\t]+',它应该匹配除制表符之外的所有内容,一次或多次。但是,它不起作用。正则表达式似乎与线上的所有内容相匹配。

例如,对于文本20<\t>Hello, Worlddiff 20<\t>Hello, Diff<\t>表示制表符),git 应该显示差异在于整个“Hello, {World,Diff}”,而不是“World”或“Diff”本身。[^\t]+但是,使用会导致 git 显示整行是更改的单个单词。

经过进一步研究,似乎 git 在内部使用了 POSIX 的 regex 函数。在 POSIX 的无限智慧中,似乎我“无法逃避字符类中的任何内容”,因为“[t]hey 将字符类中的反斜杠视为文字字符”[2]。

受另一个 StackOverflow 答案 [3] 的启发,我目前通过使用“否定速记字符类”来解决这个问题,(\S| )+. 这匹配任何非空白字符,加上空白字符本身。这实际上允许我在我的情况下做 word-diff,但我的问题仍然存在,因为这个正则表达式不会匹配其他空白字符。

所以,问题是,如何在 POSIX(扩展)正则表达式(或 GNU 扩展)中匹配“除制表符之外的所有内容”,使用或不使用字符类,而不拼写空白类中的所有其他字符?例如,我不想要(\S| |\n|\r|<other whitespace characters>)+.

[1] https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---word-diff-regexltregexgt

[2] https://www.regular-expressions.info/charclass.html,“字符类中的元字符”部分

[3] /sf/answers/242840881/

LeG*_*GEC 1

它看起来的--word-diff-regexp行为有点像grep, 并且不理解“本机”转义序列。

使其发挥作用的一些方法:

  • 使用 perl regexp :git diff有一个(未记录?)-P | --perl-regexp选项:
    git diff -P --word-diff-regex='[^\t]+'
  • 告诉你的 shell 插入一个<tab>字符:
    • (在 bash 中工作)用于$'...'应用 ANSI-C 引用(bash 参考):
      git diff --word-diff-regex=$'[^\t]+'
    • 键入ctrl+V后跟以在命令行中<tab>插入文字字符:<tab>
      git diff --word-diff-regex='[^<ctrl+V <tab>>]+
    • 使用$(...)一个打印文字的命令<tab>(例如:printf)
      git diff --word-diff-regex="[^$(printf '\t')]+"
    • ...

来源: