【问题标题】:What flavor of regex does git usegit 使用什么风格的正则表达式
【发布时间】:2017-02-08 22:30:05
【问题描述】:

我正在尝试使用 git diff --word-diff-regex= 命令,它似乎拒绝任何类型的前瞻和后瞻。我无法确定正则表达式 git 使用什么风格。例如

git diff --word-diff-regex='([.\w]+)(?!>)'

作为无效的正则表达式返回。

我正在尝试获取所有不是 HTML 标记的单词。所以正则表达式的结果匹配应该是下面字符串的 'Hello' 'World' 'Foo' 'Bar'

<p> Hello World </p><p> Foo Bar </p>

【问题讨论】:

  • 似乎不支持前瞻。也许您应该让我们知道逻辑是什么,以防有不涉及前瞻的解决方法。
  • 我更新了我的问题以显示我需要正则表达式的内容
  • 它使用 POSIX ERE。甚至是 BRE。 POSIX 从不支持环视。

标签: regex git git-diff


【解决方案1】:

Git 源使用regcompregexec,它们由 POSIX 1003.2 定义。 code to compile a diff regexp 是:

            if (regcomp(ecbdata->diff_words->word_regex,
                        o->word_regex,
                        REG_EXTENDED | REG_NEWLINE))

在 POSIX 中,这意味着这些是定义为 here 的“扩展”正则表达式。

(并非每个 C 库实际上都实现了相同的 POSIX REG_EXTENDED。Git 包含其自己的实现,可以代替系统构建。)

编辑(根据更新的问题):POSIX ERE 既没有前瞻也没有后瞻,也没有\w(但[_[:alnum:]] 对于大多数用途来说可能已经足够接近了)。

【讨论】:

  • 难怪。我正在为为什么\w+ 不起作用而头疼。感谢这个答案的提示,现在[[:alnum:]]+ 似乎工作了。不过,我还没有下定决心学习和记住一套新的正则表达式规则。
  • @RayLuo:有太多的东西无法让它们保持直截了当,但幸运的是,有一些网站可以做到这一点。请参阅this question 及其链接,包括regular-expressions.infoWikipedia。我想我更喜欢this wikipedia page
【解决方案2】:

感谢@torek 上面回答的提示,现在我意识到different flavors of regular expression engines 甚至可以有不同的语法。

即使对于一个特定的程序,例如 git,它也可以使用不同的正则表达式引擎进行编译。例如,this blog post 暗示 \w 将被 git 支持,这与我从我的机器上观察到的或这里的 OP 的要求相矛盾。

我最终发现this section from your recommended wikipedia page 最有帮助,就在一个表中呈现不同的语法而言,这样我就可以在[:alnum:]\w[:digit:]\d 之间进行一些“翻译” 、[:space:]\s 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 2011-02-05
    • 2015-05-31
    • 2013-10-27
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多