当前位置: 首页 > Web前端 > JavaScript

提取新代码行的正则表达式

时间:2023-03-27 17:48:10 JavaScript

ingitsubmissionrecords从一个gitcommitrecord中提取哪些代码已经更新。简单的说就是commitdiff显示出来的代码,需要把代码前面带+和-的行去掉。我们从RichX项目中复制了一条提交记录,并稍作修改以进行演示。+import{Plugin}from"..";-CONSTSUM=NUM??_A+NUM_B;+CONSTSUM_ALL=NUM??_A+NUM_B;exportconstDEFAULT_RICH_TEXT={-text:"SimpleRichTextDemo",+config:"SimpleRichTextDemo",setting:[],};导出类型ObjectKV={[key:string]:V;};+exportinterfaceIPlugins{+[key:string]:Plugin;+}我们来转换需求,就是正则匹配多行文本中以+和-开头的行。解决方案1思路:先匹配+:\+.*开头的字符再带上-:(\+|\-).*因为多行文本之间有换行符,所以前面的单-+开头的行文本一个字符是上一行末尾的换行符\n。同样,这一行的结尾也是一个换行符。所以我们使用正则断言将两个换行符匹配到目标文本的开头和结尾:(?<=\n)(\+|\-).*(?=\n)最后,需要两个特殊情况考虑到,整个文本的开始和结束位置。第一个字符没有上一行,所以不能匹配换行符\n,只能匹配开头的^,结束后可能没有换行符,用$代替:(?<=^|\n)(\+|\-).*(?=\n|$)代码:constcontent=`+import{Plugin}from"..";-CONSTSUM=NUM??_A+NUM_B;+CONSTSUM_ALL=NUM??_A+NUM_B;exportconstDEFAULT_RICH_TEXT={-text:"SimpleRichTextDemo",+config:"SimpleRichTextDemo",setting:[],};导出类型ObjectKV={[key:string]:V;};+exportinterfaceIPlugins{+[key:string]:Plugin;+}`content.match(/(?<=^|\n)(\+|\-).*(?=\n|$)/g)//输出数组//0:"+import{Plugin}from\"..\";"//1:"-CONSTSUM=NUM??_A+NUM_B;"//2:"+CONSTSUM_ALL=NUM??_A+NUM_B;"//3:"-text:\"SimpleRichTextDemo\","//4:"+config:\"SimpleRichTextDemo\","//5:"+exportinterfaceIPlugins{"//6:"+[key:string]:Plugin;"//7:"+}"方案二:上述方案需要自己匹配换行符,有点麻烦。我们可以省略自己判断换行符的步骤,直接匹配每行的首尾,然后使用正则表达式标志m开启多行匹配模式:/^(\+|\-).*$/克。代码:constcontent=`+import{Plugin}from"..";-CONSTSUM=NUM??_A+NUM_B;+CONSTSUM_ALL=NUM??_A+NUM_B;exportconstDEFAULT_RICH_TEXT={-text:"SimpleRichTextDemo",+config:"SimpleRichTextDemo",setting:[],};导出类型ObjectKV={[key:string]:V;};+exportinterfaceIPlugins{+[key:string]:Plugin;+}`content.match(/^(\+|\-).*$/gm)//输出数组//0:"+import{Plugin}from\"..\";"//1:"-CONSTSUM=NUM??_A+NUM_B;"//2:"+CONSTSUM_ALL=NUM??_A+NUM_B;"//3:"-text:\"SimpleRichTextDemo\","//4:"+config:\"SimpleRichTextDemo\","//5:"+exportinterfaceIPlugins{"//6:"+[key:string]:Plugin;"//7:"+}"总结以上是和朋友讨论我写正则表达式的一点心得,主要是学习断言和多行匹配标志。这里的案例比较简单,以后会有更深入的用例分享给大家。欢迎关注我们的更新#regex。参考Regex匹配多行文本js正则格式日期时间自动补全0MDN正则断言写一个函数把除最后四个字符外的所有字符都改成'#'