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 ...
随机推荐
- ONNX模型分析与使用
本文大部分内容为对 ONNX 官方资料的总结和翻译,部分知识点参考网上质量高的博客. 一,ONNX 概述 深度学习算法大多通过计算数据流图来完成神经网络的深度学习过程. 一些框架(例如CNTK,Caf ...
- java进阶篇——Stream流编程
Stream流 函数式接口 1.消费型接口--Consumer @FunctionalInterface public interface Consumer<T> { /** * 对给定的 ...
- NET-async-await是否会创建新线程
title: .NET async/await是否会创建新线程 date: 2022-12-06 10:36:46 tags: - .NET 先上结论 CPU密集型操作,比如计算,如果不使用Task, ...
- [Leetcode]完全平方数
题目 代码 class Solution { public: int numSquares(int n) { vector<int> dp(n + 1, INT_MAX); dp[0] = ...
- 一文解决如何使用 C 语言判断质数(素数)[ 附解析与源码 ]
前言 质数历来都是数学界的宠儿,是数学里神秘的谜团. 质数又和 C 语言有着不解之缘,本篇文章将讲解如何用 C 语言判断质数. 为了方便大家在读完此文章后使用文中程序,我会将判断质数的程序封装成函数, ...
- vue打包---放到服务器下(一个服务器多个项目需要配置路径),以及哈希模式和历史模式的不同配置方法
哈希模式,好用,不需要服务器配合分配路径指向,自己单机就可以打开了 接下来上代码截图 接下来开始截图 历史模式 历史模式需要后端支持 打包后自己直接点击是打不开的 截图如下
- Consumer接口-Consumer接口的默认方法andThen
Consumer接口 java.util.function.Consumer<T〉接口则正好与Supplier接口相反,它不是生产一个数据,而是消费一个数据,其数据类型由泛型决定. 抽象方法:a ...
- super与this关键字图解-Java继承的三个特点
super与this关键字图解 父类空间优先于子类对象产生 在每次创建子类对象时,先初始化父类空间,再创建其子类对象本身.目的在于子类对象中包含了其对应的父类空 间,便可以包含其父类的成员,如果父类成 ...
- Python读取大量Excel文件并跨文件批量计算平均值
本文介绍基于Python语言,实现对多个不同Excel文件进行数据读取与平均值计算的方法. 首先,让我们来看一下具体需求:目前有一个文件夹,其中存放了大量Excel文件:文件名称是每一位同学的 ...
- immutable.js 学习笔记(三)----- Map
一.Map Map在原生的js中对应的是Object这样的结构,它都是key-value的键值对,并且它是无序的 二. API (一) set:设定值 (二)delete:删除值 每做一次增删改查都会 ...