【问题标题】:"diff" tool's flavor of regex seems lacking?“差异”工具似乎缺乏正则表达式的味道?
【发布时间】:2010-01-15 14:22:25
【问题描述】:

我有两个文件一直在尝试与 diff 进行比较。这些文件是自动生成的,并具有许多如下所示的行:

//!   Generated Date  : Mon, 14, Dec 2009

我希望忽略这些差异,并已着手使用“-I REGEX”标志来实现这一点。

但是,“日期”和冒号之间出现的空格数量会有所不同,不幸的是,diff 使用的正则表达式的风格似乎缺少一些基本的正则表达式实用程序。

例如,我一辈子都无法让“一个或多个”加号起作用。同样处理空格的“\s”表示。

diff -I '.*Generated Date\s+:.*' ....

diff -I '.*Generated Date +:.*' ....

两者都失败了。

与其继续盲目地尝试,有人可以指出我对正则表达式的 diff 特定子集的一个很好的参考吗?

谢谢!

===== 编辑 =======

感谢 FalseVinylShrub,我已经确定我应该转义我的 '+' 和任何类似字符。这在一定程度上解决了这个问题。 diff 成功匹配

.*Generated Date \+.*

.*Generated Date  *.*

(注意“日期”和“*”之间有两个空格。)

但是,第二次我尝试将“:”添加到该表达式中,如下所示:

.*Generated Date \+:.*

.*Generated Date \+\:.*

两个版本都无法匹配有问题的字符串,并导致 diff 花费大量时间来运行。有什么想法吗?

【问题讨论】:

  • re your ':' 问题:我不知道为什么,但尝试(a)使用 [:] 看看是否可以逃脱任何特殊效果,即使反斜杠没有,或者(b) 使用。如果您不担心误报,可以匹配该位置的任何内容...只是在黑暗中刺伤...

标签: regex diff


【解决方案1】:

非常有趣...我找不到文档参考,但是通过一些实验发现:

  • ␠*.* 如果零个或多个对你来说是可以的
  • 正如你所说,␠+ 不起作用。 ␠{1,}... 也没有,但 ␠\{1,\} 确实有效
  • 更新:␠\+ 也有效!

代表一个空格字符,没有出现)。

我正在使用来自 GNU diffutils 2.8.1 的 GNU diff。

man diffinfo diff 没有解释 RE 语法。

希望这会有所帮助。

更新:我在man grep 中找到了一个简短的部分:

基本与扩展正则表达式

在基本正则表达式中,元字符 ?、+、{、|、( 和 ) 失去其特殊意义;而是使用反斜杠版本 \?, \+、\{、\|、\(和\)。

所以我猜它使用的是基本正则表达式语法。

【讨论】:

  • 嗯!我使用的是完全相同版本的 GNU diff,所以这是一个很好的健全性检查。我对正则表达式进行了一些更改,你瞧,你是对的!问题是,它似乎在“:”上严重中断。我将编辑我的原始帖子以描述问题。
【解决方案2】:

好的,这就是 GNU diff 源代码所说的内容。

re_set_syntax (RE_SYNTAX_GREP | RE_NO_POSIX_BACKTRACKING);

我认为这意味着“与 gnu grep -G 相同”(基本正则表达式)。根据 gnu grep 手册页:

在基本正则表达式中,元字符 ?、+、{、|、(、 和 ) 失去其特殊意义;而是使用反斜杠版本 \?、\+、\{、\|、\(和\)。

忘记\s、\S等

【讨论】:

    【解决方案3】:

    According to the specificationdiff 不支持正则表达式,也没有-I 开关。

    您似乎在使用带有非标准扩展名的非标准 diff。这些非标准扩展是如何工作的,应该在您使用的任何非标准diff 的文档中进行描述。

    【讨论】:

    • 我使用的是 GNU diff 2.8.1。这是不标准的吗?
    • GNU diff 2.8.1 是一个非常常见的版本,被许多 GNU/* 操作系统使用,例如 Linux。如果不能将 GNU 工具包视为标准,我不知道什么可以。有关 -I 开关上的(稀疏)文档,请参阅 gnu.org/software/diffutils/manual/#Specified-Lines
    猜你喜欢
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多