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: 宋体;">架构 &nbsp; &nbsp;&nbsp; <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: 宋体;">架构 &nbsp; &nbsp;&nbsp; <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批量修改——正则表达式实践的更多相关文章

  1. 使用powershell批量修改文本为utf8

    根据上一篇powershell生成pro的方法,增加一个批量修改文本文件为utf8格式的方法 $incPath = dir -filter "*.c" -Recurse $temp ...

  2. Linux下find一次查找多个指定类型文件,指定文件或者排除某类文件,在 GREP 中匹配多个关键 批量修改文件名等

    http://blog.sina.com.cn/s/blog_62e7fe670101dg9d.html linux下二进制文件查找: strings 0000.ts | grep -o " ...

  3. 批量修改文件名(Python)

    和上篇博文经历类似, 批量修改文件名字. : ) 不多说, 看图, 程序运行之前: 程序要做的事情呢, 就是挖出"[]"中的集数, 并用 “第[]集”来修改文件名字. 下面是Pyt ...

  4. Linux下批量修改文件名(rename)

    原文地址: http://blog.csdn.net/sea_shore/article/details/6102437 1.rename命令批量修改文件名, 其实linux下可以使用别的办法来批量修 ...

  5. ubuntu下如何批量修改文件后缀名

    正确的方法是: 在命令行中输入   rename   's/\.JPG/.jpg/'    *.JPG [注意] 在单引号中的最后一个'/'符号不能少! 意思是:把当前文件夹下的所有 .JPG文件 替 ...

  6. linux rename命令批量修改文件名

    修改文件名可以用mv命令来实现 mv filename1 filename2 1 但如果批量修改还是使用rename命令更为方便 现在我们有a b c d 四个文件 增加后缀 rename 's/$/ ...

  7. 在Linux中批量修改字符串的命令

    昨天一个朋友忽然问我,在Linux下如何批量修改字符串,当时瞬间懵逼了,完全想不起来....... 今天特意的重温了一下Linux下的一些常用命令,并将这个遗忘的批量修改字符串的命令记录下来(资料来自 ...

  8. Python批量修改文件名(os库)

    问题: 在某一文件夹内有97个sql文件,全部都以统一格式命名,例如“A201222-广州李小龙纪念协会-1-广州李小龙纪念协会-2018.AUD” 由于有两段重复了,而且中间的“1”也没有意义,需要 ...

  9. rename 批量修改文件名

    1.rename的用法 rename与mv的区别就是mv只能对单个文件重命名,而rename可以批量修改文件名 linux中的rename有两种版本,一种是C语言版的,一种是Perl版的.早期的Lin ...

随机推荐

  1. 利用 Python 进行批量更改文件后缀

    利用 Python 进行批量更改文件后缀 代码 import os files = os.listdir('.') for file_name in files: portion = os.path. ...

  2. NancyFx 2.0的开源框架的使用-ConstraintRouting

    新建一个空的Web项目 然后在Nuget库中安装下面两个包 Nancy Nancy.Hosting.Aspnet 然后在根目录添加三个文件夹,分别是models,Module,Views 然后往Mod ...

  3. Sql Server中的标识列(自增长字段)

    一.标识列的定义以及特点 SQL Server中的标识列又称标识符列,习惯上又叫自增列.该种列具有以下三种特点: 1.列的数据类型为不带小数的数值类型2.在进行插入(Insert)操作时,该列的值是由 ...

  4. vue-cli安装以及搭建vue项目详细步骤

    vue init webpack projectname(projectname是你项目的名称) 创建项目卡住不动解决方案: https://cli.vuejs.org/zh/guide/instal ...

  5. tuple&dict

    # n = (12,[23,56]) # n[1][0] = 89 #元组不可修改,但元组内部的列表内部的元素可以修改,但内部的列表的内部也是元组,则他不可修改 # print(n) # n = (1 ...

  6. 树——binary-tree-maximum-path-sum(二叉树最大路径和)

    问题: Given a binary tree, find the maximum path sum. The path may start and end at any node in the tr ...

  7. [HNOI2009]有趣的数列(卡塔兰数,线性筛)

    [HNOI2009]有趣的数列 题目描述 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足a1< ...

  8. Js中window.location.href和window.location.replace的区别

    href相当于打开一个新页面,replace相当于替换当前页面:这里打开页面都是针对历史记录来说,在页面上看完全相同,只是浏览器的history表现不同如果在1.html中点击链接到2.html,然后 ...

  9. python-数据驱动

    1.parameterized.parameterized import unittest from parameterized import parameterized,param class Te ...

  10. 在linux中 部署 mongo 数据库服务端

    1 首先需要一台linux服务器(我用的redhat linux,其它的也大同小异), 玩一玩的话,推荐亚马逊上面去创建一个免费的linux服务器,有关具体创建linux服务器不在这赘述. https ...