HTML批量修改——正则表达式实践
1.问题描述
如下所示的一段HTML代码:
...
<h2 align="justify"><span style="background-color: #99ccff;">2.1.<span style="font-family: 宋体;">从文件系统级理解</span><span style="font-family: Calibri;">ROS</span><span style="font-family: 宋体;">架构 <br></span></span></h2>
...
想将其整体转换为Markdown的标题格式:
#1.从文件系统级理解
2.初步研究
使用正则表达式<h2.*>,检索结果为:
<h2 align="justify"><span style="background-color: #99ccff;">2.1.<span style="font-family: 宋体;">从文件系统级理解</span><span style="font-family: Calibri;">ROS</span><span style="font-family: 宋体;">架构 <br></span></span></h2>
这样可以做到检索到所需要的代码段,但是还没能做到将所需的文字提取并缓存,以供替换。
3.进一步研究
3.1提取2.*中的序号*
若要提取出2.*中的序号*,需要使用到子表达式()。另外,由于*是贪婪的,必须使用?使表达式实现最小匹配。
使用正则表达式<h2.*?>,检索结果为:<h2 align="justify">。由于表达式非贪婪,只检索到第一个'>'便结束了。为了检测到第二个'>',我们将'.*?>'作为子表达式,条件为检索到2次。由于此结果我们不会使用,因此加上'?:'使之忽略对此匹配的捕捉。
使用<h2(?:.*?>){2},检索结果为:<h2 align="justify"><span style="background-color: #99ccff;">。此时,只需要加入对'2.'的检索,即可将定位在2.*中的*处。由于.是特殊字符,加上''进行检索。
使用<h2(?:.*?>){2}2\.,检索结果为:<h2 align="justify"><span style="background-color: #99ccff;">2.。此时,使用对数字的检索'[1-9]'并加以限定为检索到1次,再加上子表达式并缓存其结果即可。
使用<h2(?:.*?>){2}2\.([1-9]){1}\.,检索结果为:<h2 align="justify"><span style="background-color: #99ccff;">2.1.,同时'2.1'中的'1'已被缓存为'\1'。
3.2提取标题
标题是第二个需要提取的内容,也即HTML代码中的”从文件系统级理解“。上文中已经提到的内容不会重复。
首先,定位到汉字之前。使用正则表达式<h2(?:.*?>){2}2\.([1-9]){1}\..*?>,检索结果为:<h2 align="justify"><span style="background-color: #99ccff;">2.1.<span style="font-family: 宋体;">。
然后,提取汉字内容。使用正则表达式<h2(?:.*?>){2}2\.([1-9]){1}\..*?>(\w*?)<,检索结果为:<h2 align="justify"><span style="background-color: #99ccff;">2.1.<span style="font-family: 宋体;">从文件系统级理解,同时标题被缓存为'\2'。
注意:'\w'在某些操作系统/环境的作用下,不支持检索汉字。因此也可以使用<h2(?:.*?>){2}2\.([1-9]){1}\..*?>(.*?)<。
3.3选取全文
选取全文只需要在之前正则表达式的基础之上,加入对标题后字符的检索即可。
使用正则表达式<h2(?:.*?>){2}2\.([1-9]){1}\..*?>(\w*?)<.*>即可。
3.4替换
替换同样不复杂,按照Markdown格式,替换为##\1.\2。替换结果:##1.从文件系统级理解。
注意:在部分软件/语言中,可能需要使用##$1.$2。
参考资料
HTML批量修改——正则表达式实践的更多相关文章
- 使用powershell批量修改文本为utf8
根据上一篇powershell生成pro的方法,增加一个批量修改文本文件为utf8格式的方法 $incPath = dir -filter "*.c" -Recurse $temp ...
- Linux下find一次查找多个指定类型文件,指定文件或者排除某类文件,在 GREP 中匹配多个关键 批量修改文件名等
http://blog.sina.com.cn/s/blog_62e7fe670101dg9d.html linux下二进制文件查找: strings 0000.ts | grep -o " ...
- 批量修改文件名(Python)
和上篇博文经历类似, 批量修改文件名字. : ) 不多说, 看图, 程序运行之前: 程序要做的事情呢, 就是挖出"[]"中的集数, 并用 “第[]集”来修改文件名字. 下面是Pyt ...
- Linux下批量修改文件名(rename)
原文地址: http://blog.csdn.net/sea_shore/article/details/6102437 1.rename命令批量修改文件名, 其实linux下可以使用别的办法来批量修 ...
- ubuntu下如何批量修改文件后缀名
正确的方法是: 在命令行中输入 rename 's/\.JPG/.jpg/' *.JPG [注意] 在单引号中的最后一个'/'符号不能少! 意思是:把当前文件夹下的所有 .JPG文件 替 ...
- linux rename命令批量修改文件名
修改文件名可以用mv命令来实现 mv filename1 filename2 1 但如果批量修改还是使用rename命令更为方便 现在我们有a b c d 四个文件 增加后缀 rename 's/$/ ...
- 在Linux中批量修改字符串的命令
昨天一个朋友忽然问我,在Linux下如何批量修改字符串,当时瞬间懵逼了,完全想不起来....... 今天特意的重温了一下Linux下的一些常用命令,并将这个遗忘的批量修改字符串的命令记录下来(资料来自 ...
- Python批量修改文件名(os库)
问题: 在某一文件夹内有97个sql文件,全部都以统一格式命名,例如“A201222-广州李小龙纪念协会-1-广州李小龙纪念协会-2018.AUD” 由于有两段重复了,而且中间的“1”也没有意义,需要 ...
- rename 批量修改文件名
1.rename的用法 rename与mv的区别就是mv只能对单个文件重命名,而rename可以批量修改文件名 linux中的rename有两种版本,一种是C语言版的,一种是Perl版的.早期的Lin ...
随机推荐
- Leetcode Lect7 哈希表
传统的哈希表 对于长度为n的哈希表,它的存储过程如下: 根据 key 计算出它的哈希值 h=hash(key) 假设箱子的个数为 n,那么这个键值对应该放在第 (h % n) 个箱子中 如果该箱子中已 ...
- 前端校招知识体系之css
本文将从以下四个方面展开介绍: 选择器 样式表继承 css3部分特性 BFC css选择器优先级策略 先附上个链接:css选择器参考手册 内联>id>class=属性选择器=伪类选择器&g ...
- 2018-8-10-win10-uwp-读写XML
title author date CreateTime categories win10 uwp 读写XML lindexi 2018-08-10 19:16:51 +0800 2018-2-13 ...
- [Luogu2015]二叉苹果树(树形dp)
[Luogu2015] 二叉苹果树 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. ...
- CF9D How many trees? (dp)
这题我想了好久 设 \(f_{i,j}\) 为 \(i\) 结点 \(<=j\) 的方案数 固定根,枚举左右子树,就有: \[f_{i,j}=\sum_{k=0}^{n-1}f_{k,j-1}* ...
- loj6038「雅礼集训 2017 Day5」远行 树的直径+并查集+LCT
题目传送门 https://loj.ac/problem/6038 题解 根据树的直径的两个性质: 距离树上一个点最远的点一定是任意一条直径的一个端点. 两个联通块的并的直径是各自的联通块的两条直径的 ...
- Kettle日志级别
Kettle的日志级别LogLevel分为以下几个: Nothing 没有日志 不显示任何输出 Error 错误日志 仅仅显示错误信息 Minimal 最小日志 使用最小的日志 Basic 基本日志 ...
- matplotlib.pyplot 包
import matplotlib.pyplot as plt 图片的打开和保存: from PIL import Image img=Image.open('....') img.save('... ...
- ht-2 arrayList特性
一.arrayList对象创建 当调用无参构造方法来构造一个ArrayList对象时,它会在内部分配一个初始大小为10的一个Object类型数组, 当添加的数据容量超过数组大小的时候,会产生一个新的数 ...
- FTP错误 [ftp: connect: No route to host] 解决方法
问题: 昨天在局域网内的两台机器上用ftp命令传文件.因为是新机器所以没安装ftp. 分别在两台机器上安装了ftp的服务端和客户端,并启动了ftp服务器进程. 当用启动ftp连接另一台机器时发生了如下 ...