我正在尝试使用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,“字符类中的元字符”部分
它看起来的--word-diff-regexp行为有点像grep, 并且不理解“本机”转义序列。
使其发挥作用的一些方法:
git diff有一个(未记录?)-P | --perl-regexp选项:git diff -P --word-diff-regex='[^\t]+'<tab>字符:
$'...'应用 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')]+"来源: