美文网首页
正则表达式提取 git 新增代码行

正则表达式提取 git 新增代码行

作者: 涅槃快乐是金 | 来源:发表于2024-01-11 22:44 被阅读0次

需求

最近有小伙伴提了个需求,想用正则表达式从一段 git 提交记录中提取出具体更新了哪些代码,简单来说就是 commit diff 展示的代码,需要把 代码前面带 +- 的行剥离出来。

我们从 RichX 项目复制出来一段提交记录,稍作修改用于演示。

+ import { Plugin } from "..";
- CONST SUM = NUM_A + NUM_B;
+ CONST SUM_ALL = NUM_A + NUM_B;

  export const DEFAULT_RICH_TEXT = {
-   text: "Simple Rich Text Demo",
+   config: "Simple Rich Text Demo",
    setting: [],
  };

  export type ObjectKV<V = object> = {
    [key: string]: V;
  };

+ export interface IPlugins {
+   [key: string]: Plugin;
+ }

我们把需求转换下,就是正则匹配多行文本中以 +- 开头的行。

解法一

思路:

  1. 首先匹配 + 开头的字符:\+.*
  2. 然后带上 -(\+|\-).*
  3. 因为多行文本之间是有换行符分割的,所以 + 开头的单行文本的前面一个字符,就是上一行最后的换行符 \n,同样的,这一行的结尾也是换行符。所以我们利用正则断言,将两个换行符匹配目标文本的首尾即可:(?<=\n)(\+|\-).*(?=\n)
  4. 最后还要考虑两个特殊情况,整个文本的首尾位置。首位没有上一行所以匹配不到换行符 \n,只能匹配开头 ^,结尾后面也可能没有换行符,用 $ 代替:(?<=^|\n)(\+|\-).*(?=\n|$)

代码:

const content = `+ import { Plugin } from "..";
- CONST SUM = NUM_A + NUM_B;
+ CONST SUM_ALL = NUM_A + NUM_B;

  export const DEFAULT_RICH_TEXT = {
-   text: "Simple Rich Text Demo",
+   config: "Simple Rich Text Demo",
    setting: [],
  };

  export type ObjectKV<V = object> = {
    [key: string]: V;
  };

+ export interface IPlugins {
+   [key: string]: Plugin;
+ }`

content.match(/(?<=^|\n)(\+|\-).*(?=\n|$)/g)

// 输出数组
// 0: "+ import { Plugin } from \"..\";"
// 1: "- CONST SUM = NUM_A + NUM_B;"
// 2: "+ CONST SUM_ALL = NUM_A + NUM_B;"
// 3: "-   text: \"Simple Rich Text Demo\","
// 4: "+   config: \"Simple Rich Text Demo\","
// 5: "+ export interface IPlugins {"
// 6: "+   [key: string]: Plugin;"
// 7: "+ }"

解法二

思路:

上面的方案要自己匹配换行符,有点麻烦。我们可以省去自己判断换行符的步骤,直接匹配每一行的首尾,再使用正则表达式标志 m 启用多行匹配模式:/^(\+|\-).*$/gm

代码:

const content = `+ import { Plugin } from "..";
- CONST SUM = NUM_A + NUM_B;
+ CONST SUM_ALL = NUM_A + NUM_B;

  export const DEFAULT_RICH_TEXT = {
-   text: "Simple Rich Text Demo",
+   config: "Simple Rich Text Demo",
    setting: [],
  };

  export type ObjectKV<V = object> = {
    [key: string]: V;
  };

+ export interface IPlugins {
+   [key: string]: Plugin;
+ }`

content.match(/^(\+|\-).*$/gm)

// 输出数组
// 0: "+ import { Plugin } from \"..\";"
// 1: "- CONST SUM = NUM_A + NUM_B;"
// 2: "+ CONST SUM_ALL = NUM_A + NUM_B;"
// 3: "-   text: \"Simple Rich Text Demo\","
// 4: "+   config: \"Simple Rich Text Demo\","
// 5: "+ export interface IPlugins {"
// 6: "+   [key: string]: Plugin;"
// 7: "+ }"

总结

以上就是和小伙伴一起探讨出的一点写正则表达式的经验,主要学习了断言和多行匹配标志。这里的案例还比较简单,后续有更深入使用案例再和大家分享,欢迎关注我们的更新 #regex

参考

相关文章

  • Jmeter - ForEach控制器的使用

    1、新增 http 请求,察看结果树的响应结果 2、新增正则表达式提取器,设置: 3、新增ForEach控制器 4...

  • 代码小笔记:git代码提交步骤及注意事项

    git 提交代码步骤 将需要新增的代码执行 git add . 加到本地缓存中 执行git commit -...

  • Git 常用命令

    克隆代码到本地 git clone url 新增本地分支 git branch 查看本地分支 git br...

  • jmeter通过正则提取用户token进行后面的操作

    通过正则表达式提取到用户的token进行后面的操作 1、添加线程组 2、新增登录接口的请求 3、提取uid和tok...

  • js利用正则表达式解析超链接

    目标:在文本中,找到 元素,解析超链接,提取链接地址和链接文字。 正则表达式 代码v0.01:bug: 正则表达式...

  • 基于C++的正则原理提取网页链接

    VC++ 采用正则的原理提取网页链接,一个网页链接提取器的代码,采用了正则表达式的部分方法来从文件字符中提取出网址...

  • git mergetool 解决合并冲突

    【背景】1.创建代码库后git clone到本地,新增文件,然后add--commit--push代码到代码库,此...

  • re.findall

    比如下面一段html想提取出图片路径与影片名称,主演,上映时间通过一行正则表达式怎么提取. 提取图片路径, re模...

  • 常用SQL技巧

    1.正则表达式MySQL利用regexp命令提供正则表达式功能,匹配时区分大小写。 2.巧用rand()提取随机行...

  • LeakCanary内存泄露检测原理

    LeakCanary代码量比较多,阅读源码容易把人绕晕,提取主干代码,精简后的代码只有200行,看完这200行代码...

网友评论

      本文标题:正则表达式提取 git 新增代码行

      本文链接:https://www.haomeiwen.com/subject/bafxodtx.html