Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;“差别”;工具&x27;regex的味道似乎缺乏?_Regex_Diff - Fatal编程技术网

&引用;“差别”;工具&x27;regex的味道似乎缺乏?

&引用;“差别”;工具&x27;regex的味道似乎缺乏?,regex,diff,Regex,Diff,我有两个文件,我一直试图与diff进行比较。这些文件是自动生成的,有许多行,看起来像: //! Generated Date : Mon, 14, Dec 2009 我希望这些差异被忽略,并且已经开始使用“-I REGEX”标志来实现这一点 然而,出现在“Date”和冒号之间的空格的数量不同,不幸的是,diff使用的正则表达式似乎缺少一些基本的正则表达式实用程序 例如,我一辈子都不能让“一个或多个”加号工作。对于空格的“\s”表示形式,处理方法相同 diff -I '.*Generate

我有两个文件,我一直试图与diff进行比较。这些文件是自动生成的,有许多行,看起来像:

//!   Generated Date  : Mon, 14, Dec 2009
我希望这些差异被忽略,并且已经开始使用“-I REGEX”标志来实现这一点

然而,出现在“Date”和冒号之间的空格的数量不同,不幸的是,diff使用的正则表达式似乎缺少一些基本的正则表达式实用程序

例如,我一辈子都不能让“一个或多个”加号工作。对于空格的“\s”表示形式,处理方法相同

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

两者都失败得惊人

与其继续盲目地尝试,有人能给我一个关于正则表达式的diff-specific子集的好参考吗

谢谢

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

多亏了FalseVinylBush,我已经确定我应该摆脱“+”和任何类似的字符。这在一定程度上解决了这个问题。Diff成功匹配

.*Generated Date \+.*

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

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

.*Generated Date \+:.*

这两个版本都无法匹配所讨论的字符串,并导致diff的运行时间大大增加。有什么想法吗?

diff
不支持正则表达式,也没有
-I
开关


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

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

  • ␠*
    *
    在零或更多对您合适的情况下起作用
  • 正如你所说,
    ␠+不起作用。
    ␠{1,}
    。。。但是
    ␠\{1,\}
    确实有效
  • 更新:
    ␠\+也有效
    
表示未显示的空格字符)

我正在使用GNU diffutils 2.8.1中的GNU diff

man diff
info diff
没有解释重新语法

希望这有帮助

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

基本正则表达式与扩展正则表达式 在基本正则表达式中,元字符?、+、{、|、(、和) 失去它们的特殊意义;改为使用反斜杠版本\?, \+,{,\\\;,\(,和\)


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

好的,下面是GNU diff源代码所说的

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

在基本正则表达式中,元字符?,+,{,|,(, 及) 失去它们的特殊意义;改为使用反斜杠版本 \?,\+,\{,\\\\;,\(,和\)


忘记\s、\s等。

我正在使用GNU diff 2.8.1。这是非标准的?GNU diff 2.8.1是许多GNU/*操作系统(如Linux)使用的一个非常常见的版本。如果GNU工具包不能被视为标准,我不知道可以使用什么。请参阅(稀疏)在-I开关上的文档。嗯!我使用的是完全相同版本的GNU diff,所以这是一个很好的理智检查。我用正则表达式做了一些更改,你看,你是对的!问题是,它似乎在“:”上坏得很厉害。我将编辑我的原始帖子来描述这个问题。你的“:”问题:我不知道为什么,但尝试使用[:]如果你不担心误报的话,看看它是否能逃过任何特殊的影响,即使反斜杠没有,或者(b)使用。如果你不担心误报的话,在那个位置匹配任何东西…只是在黑暗中捅一刀。。。
.*Generated Date \+:.*
.*Generated Date \+\:.*
re_set_syntax (RE_SYNTAX_GREP | RE_NO_POSIX_BACKTRACKING);