正则表达式查找文件中的合并冲突

Regular Expression to find merge conflicts in file

这是包含合并冲突的文件,

<<<<<<< HEAD
$conf['some_unit_id'] = '4-qw-gg-ds-sometext';
=======
// Some Snippets Site Info
$conf['site_info'] = array(
  'customer_service_phone' => '+1 323223232
  'logo_path' => 'https://www.google.com/img/icons/src/logo.svg',
  'currency' => 'CAD',
    'https://www.youtube.com/user/somewebsite/ogog',
    'https://www.instagram.com/somewebsite/',
  ),
);
>>>>>>> ff6df3435231fdff78fwsd83e7dffa0732eft554

// Somes code
$done['rules'] = TRUE;

我正在尝试找到检测文件中合并冲突的最佳正则表达式。最初我尝试使用 :

/(<* HEAD)/

这将只检测 HEAD 和一些前面的 < 我还有一些其他标记,例如:

1. ======
2. >>>>> ff6df3435231fdff78fwsd83e7dffa0732eft554

这两个标记也必须与HEAD标记一起检测。如果开发人员仅修复合并冲突 <* HEAD 和其余部分,即 ===== and >>> ff6df3435231fdff78fwsd83e7dffa0732eft554 正则表达式也应该检测到。

因为这个正则表达式在预提交挂钩中使用。如果在文件提交中检测到一种模式将会中断。我需要精确的正则表达式来检测合并冲突标记。

任何解决方案将不胜感激。

因为它们都是一样长的,你可以使用一个字符组:

/^[<=>]{7}( .+)?$/mg

(确保使用 multiline 正则表达式)

如果我没理解错你的愿望,你想找到需要解决冲突的代码块。希望我的建议可以帮到你。

/^<{7}\sHEAD[\s\S]+?>{7}\s\w+$/gm

详情:

  • 模式:多行
  • ^<{7}\sHEAD:块代码以 <<<<<<< HEAD
  • 开头
  • [\s\S]+?: 尽可能少地获取任何字符(接受换行符)
  • {7}\s\w+$: block code ends with >>>>>>> commit hash

Demo

您可以使用:

^<{7} HEAD(?:(?!={7})[\s\S])*={7}(?:(?!>{7} \w+)[\s\S])*>{7} \w+

Demo & explanation

您还可以通过检查每行的开头来匹配所有行,以防止使用 [\s\S] 进行一些不必要的回溯。

先匹配<<<<<<< HEAD部分,再匹配后面所有不以=======开头的行再匹配

然后匹配所有不以 >>>>>>> 开头的行,然后匹配它和字符 [a-z0-9].

^<{7} HEAD(?:\r?\n(?!={7}\r?\n).*)*\r?\n={7}(?:\r?\n(?!>{7} ).*)*\r?\n>{7} [a-z0-9]+

Regex demo

如果要突出显示标记,可以使用捕获组:

^(<{7} HEAD)(?:\r?\n(?!={7}\r?\n).*)*\r?\n(={7})(?:\r?\n(?!>{7} ).*)*\r?\n(>{7} [a-z0-9]+)

Regex demo