【问题标题】:How to make a positive lookahead regex match when using Git's built-in regex matching?使用 Git 的内置正则表达式匹配时如何进行积极的前瞻正则表达式匹配?
【发布时间】:2021-10-25 08:54:47
【问题描述】:

我无法在git grep 和/或git log -L 中使用基于正则表达式的正则表达式。我正在使用git log -L <funcname>:<filename> 使用正则表达式<funcname> 的功能。测试文件如下:

public class FakeFile {
    public static void main(String[] args) {
        System.out.println('Hello World');
    }
    public static void method2() {
        System.out.println('method2');
    }
    public static void method2(float i) {
        System.out.println(String.format('method2 %f', i));
    }
    public static void method3() {
        System.out.println('method3');
    }
}

this answer 之后,我使用^(?=.*float i).*method2.*$ 来匹配使用浮点参数定义method2 的行。它适用于rubular,但我无法使用grepgit log -L 在我的shell 中运行它。我尝试用'\ 字符包围它,但没有成功。

有什么想法吗?

编辑:添加缺少的.* 是正则表达式。

【问题讨论】:

  • 在 rubular 演示中,您使用 ^(?=.*float i).*method2.*$,这与 ^(?=float i).*method2.*$ 不同,如果支持,您是否尝试过 grep -oP
  • 好吧,你不能指望在方法名之前声明参数,所以你仍然不需要环顾四周,^.*method2.*float i.* 就可以了。
  • @WiktorStribiżew 我需要一种以任何顺序匹配参数的方法,这就是我考虑积极前瞻的原因。你是对的,我在消息中打错了字,我正在将其更改为在前瞻中包含.*
  • @Thefourthbird 我不能依赖 grep 参数,因为我需要正则表达式才能使用 git log -L 命令,但感谢您的评论!
  • 无论如何,POSIX 正则表达式不支持环视。你不能在这里使用它们。如果您可以使用-P 启用PCRE 引擎,那么您只能使用lookarounds。

标签: regex git


【解决方案1】:

作为Wiktor Stribiżew notes in a comment,您可以在此处使用^float i.*method2.* 来匹配行(尽管作为“函数名称”这可能比您想要的更多——但至少在git log -L 输出中,无论如何这些只是文本) .

归根结底,这里的问题与 Git 支持的正则表达式语法有关。

通常支持的主要是“POSIX ERE”。有关更多详细信息,请参阅What flavor of regex does git use。但是,git grep 具有选择不同模式类型的标志,加上grep.patternType,而-L 函数名称参数在line-range.c 中传递给parse_range_funcname。令人讨厌的是,由于this line,这甚至不使用 ERE,而是使用 BRE:

reg_error = regcomp(&regexp, pattern, REG_NEWLINE);

这意味着对于git log 中的-L 表达式,甚至不允许交替。 (git grep 当然可以交替使用。)这否定了The fourth bird 提出的想法。如果函数模式匹配器允许 ERE,那可能会很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2020-04-15
    相关资源
    最近更新 更多