如何解决如何匹配除选项卡之外的所有内容对于 git diff --word-diff-regex
我正在尝试使用 git diff --word-diff-regex
[1] 进行 word-diff。基本上,此正则表达式的任何匹配都被视为一个单词。我的文档是一个制表符分隔的文本文件,每列可能包含空格字符。因此,我尝试使用否定字符类 --word-diff-regex='[^\t]+'
,它应该匹配除制表符以外的所有内容,一次或多次。但是,它不起作用。正则表达式似乎匹配行上的所有内容。
例如,文本 20<\t>Hello,World
diff 与 20<\t>Hello,Diff
(其中 <\t>
表示制表符),git 应该显示差异在于整个“Hello,{World,Diff}”,而不是“世界”或“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] https://stackoverflow.com/a/3469155/9161044
解决方法
看起来 --word-diff-regexp
的行为有点像 grep
,并且不会“本地”理解转义序列。
一些使它工作的方法:
- 使用 perl 正则表达式:
git diff
有一个(未记录的?)-P | --perl-regexp
选项:git diff -P --word-diff-regex='[^\t]+'
- 告诉你的 shell 插入一个
<tab>
字符:- (在 bash 中工作)使用
$'...'
来应用 ANSI-C 引用 (bash reference) :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')]+"
- ...
- (在 bash 中工作)使用
来源:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。