js正则匹配多行文本
原文:https://lwebapp.com/zh/post/regular-expression-to-match-multiple-lines-of-text
需求
最近有小伙伴提了个需求,想用正则表达式从一段 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;
+ }
我们把需求转换下,就是正则匹配多行文本中以 + 和 - 开头的行。
解法一
思路:
- 首先匹配
+开头的字符:\+.* - 然后带上
-:(\+|\-).* - 因为多行文本之间是有换行符分割的,所以
+开头的单行文本的前面一个字符,就是上一行最后的换行符\n,同样的,这一行的结尾也是换行符。所以我们利用正则断言,将两个换行符匹配目标文本的首尾即可:(?<=\n)(\+|\-).*(?=\n) - 最后还要考虑两个特殊情况,整个文本的首尾位置。首位没有上一行所以匹配不到换行符
\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。
参考
js正则匹配多行文本的更多相关文章
- js正则匹配的一个日常应用
应用实例 1 /** 将段落中的 \n 转换为 <p></p>, 规范存储 */ 2 function formatParagraphForStore(val) { 3 var ...
- JS正则密码复杂度校验之:JS正则匹配半角英文符号
概述 在JS密码校验中常常会遇到密码强度的校验需求,借用一位朋友提问的图,他在工作中遇到的一个比较经典的密码强度校验要求: 这个需求有两个难点,一,是如何使用正则匹配所有半角英文标点符号,二,是如何验 ...
- Python正则匹配多行,多个数据
最近用Python做一个crawler工具的时候,发现用一个正则表达式可以匹配到个数据的时候用match.group()只能打印出第一个数据,其它数据不能打印出来.最后找到解决方法,现在记录一下,直接 ...
- js正则匹配两位小数
今天写一个用js正则校验最多保留两位小数的格式. a = /^\d+|\d+\.\d{1,2}$/; 测试 a.test(1.222); 结果:true 一下蒙了,怎么可能,最后找了好久,原来需要把^ ...
- js 正则匹配 域名【host】
如果直接在js中是可以直接取到hostname的,以下方式是通过正则匹配: var url = "http://www.cnblogs.com/cench" var reg = / ...
- js 正则匹配(去掉html标签)
正则匹配去掉所有html标签 var a = "<span>999</span>" a = a.replace(/<[^>]+>/g,' ...
- js 正则匹配 小结
JS的正则表达式 rge.test(str) 检验目标对象中是否包含匹配模式,并相应的返回true或false rge.source str.search(rge) 将返回一个整数值,指明这个匹配 ...
- js正则匹配字符串
这里我第一时间想到的就是用 js 的search 和 match ,其中最常见的是match: 1. str.search(regexp):search()方法不支持全局搜索,因为会忽略正则表达式参数 ...
- PHP正则匹配title标题文本
//////////////////////////////////////////////////////////////////////////////////////////////////// ...
- js正则匹配table,img及去除各种标签问题
//获取公示栏内容 s = "$row.detail$"; mainContent =s; //如果有多个table使用下面注释的正则只会匹配成一个table //var tabR ...
随机推荐
- Centos下部署最后一版支持Docker的k8s集群
部署版本 首先要确定部署的版本 查询Kubernetes对Docker支持的情况 kubernetes/dependencies.yaml at master · kubernetes/kuberne ...
- 2022弱口令实验室招新赛CTF赛道WriteUp
Misc 签到 下载附件,得到一张二维码. 扫码,然后根据提示"linux"操作系统,直接cat /flag,得到flag. EasyMisc 下载得到EasyMisc附件,压缩包 ...
- wsl2 kali修改语言
直接执行sudo dpkg-reconfigure locales 会提示 dpkg-query: package 'locales' is not installed and no informat ...
- 初探富文本之OT协同算法
初探富文本之OT协同算法 OT的英文全称是Operational Transformation,是一种处理协同编辑的算法.当前OT算法用的比较多的地方就是富文本编辑器领域了,常用于作为实现文档协同的底 ...
- 【Linux技术专题系列】「必备基础知识」一起探索和实践sftp配置之密钥方式登录
FTP服务-vsftp协议实现 我们常用的是FTP协议,主要是通过VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,它的全称是Very Secure FTP 从此名称可以看出来, ...
- 工作这么多年,我总结的数据传输对象 (DTO) 的最佳实践
前言 数据传输对象 (DTO) 是一种设计模式,常用于软件开发不同层或者不同系统之间传输数据.DTO 的主要目的是封装数据并防止它被其他层或系统直接访问或修改.通过遵循一组最佳实践,开发人员可以确保他 ...
- 复杂环境下ocr与印章识别技术理解及研发趋势
引言 随着社会经济的发展,印章作为企事业单位.社会团体.政府部门乃至国家的一种具有法律意义的标志和证据,在现代社会生活中发挥着重要作用.随着现代商务活动的不断发展,企业在业务开展的过程中通常会涉及大量 ...
- 11月30日内容总结——前端简介、http协议概念、html协议概念及基础知识和部分标签的讲解
目录 一.前端与后端的概念 什么是前端开发? 什么是后端? 学习前端的目的 前端三剑客 二.前端前戏 三.HTTP协议 1.四大特性 2.报文格式 3.响应状态码 四.HTML概览 1.HTML简介 ...
- 11月15日内容总结——软件开发架构、网络编程介绍和OSI七层协议介绍
目录 一.软件开发架构 1.什么是软件开发架构 2.软件开发架构 架构方式一:c/s架构 架构方式二:b/s架构 架构优劣势 二.架构总结 三.网络编程前戏 1.什么是网络编程 2.学习网络编程的目的 ...
- 现代图片性能优化及体验优化指南 - 图片类型及 Picture 标签的使用
图片资源,在我们的业务中可谓是占据了非常大头的一环,尤其是其对带宽的消耗是十分巨大的. 对图片的性能优化及体验优化在今天就显得尤为重要.本文,就将从各个方面阐述,在各种新特性满头飞的今天,我们可以如何 ...