gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:09:49 25 4
gpt4 key购买 nike

我正在尝试使用 git diff --word-diff-regex 做 word-diff [1]。基本上,此正则表达式的任何匹配都被视为一个单词。我的文档是一个制表符分隔的文本文件,每列可能包含空格字符。所以,我尝试使用否定字符类,--word-diff-regex='[^\t]+' ,它应该匹配除选项卡之外的所有内容,一次或多次。但是,它不起作用。正则表达式似乎与线上的所有内容相匹配。
例如,文本 20<\t>Hello, World20<\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] 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')]+"
  • ...


  • 来源:
  • grep find lines that contains " \t"
  • How to grep for tabs without using literal tabs and why does \t not work? (在 AskUbuntu 上)
  • 关于regex - 如何匹配除选项卡之外的所有内容(对于 git diff --word-diff-regex),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65396615/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com