平衡正则 html,正则表达式-利用平衡组匹配html
8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
从下面的HTML代码片段中匹配 到 span#test 标签内容1
2
3
4
5
6
7
8
9
hi~
虫虫
:
早上好。
首先要找到 标签 和 标签 ,如果这两个不会,后面不用看了……补基础吧~~1
2
3
4//起始
]*id="test"[^>]*>
//结束
我们会发现代码中夹杂着多个HTML标签,em还好,因为正则里面写死了是 span, 所以它是可以直接忽略掉的, 但是多余的 会造成干扰。那么如果是在程序中,我们是怎么处理的呢? 可以使用计数器(或者说是stack结构,但是我们只需要关心里面的元素个数,所以使用计数器就行了)。从id=”test” 后面的开始处理,遇到 计数+1 ,遇到 时,如果计数>0则-1否则 就匹配到了找到#test 的span 后开始,(如果找不到这个id的span,其实可以直接结束匹配了)
var c = 0; // 初始栈
遇到 ,入栈,栈内标签数量: c=c+1=1;
遇到 ,入栈: c=c+1=2;
遇到虫虫后面的 (关闭span3) , 因为 c>0 所以c=c-1=1;
下一个 (关闭span1), 因为 c>0 所以所以c=c-1=0;
遇到 c=c+1 = 1
下一个 (关闭span3), 因为 c>0 所以所以c=c-1=0;
下一个 (关闭test),因为此时 c==0 , 所以匹配到这里结束了。
有同学会纠结标签怎么办?em并不是我们要查找的标签名称,直接当普通字符串忽略掉就是了……
根据这个思路 ,我们可以使用正则表达式中平衡组的概念,首先将span定义到一个分组中,那么查找 #test 的开始标签就可以是
]*id="test"[^>]*> 结束符使用反向引用 说明一下:
(?'分组名'表达式) 表示将表达式匹配到的内容放入分组中。
k'分组名' 表示引用之前的分组。
上面的例子中 (?'tag'span) 表达式是 span 如果匹配到这四个字符的话,放进名称为 tag 的组中。那么后面k'tag' 其实就是匹配 span字符。
中间部分情况比较多:一类是普通字符,包含类似这样的标签,直接使用 ([dD])
一类是span的标签,我们同样,定义一个计数器 c 专门处理它:
遇到开始标签时 c+1 使用 (?'c']*>) // 其实是将匹配到的标签推送到c组
遇到结束标签时 c-1 使用 (?'-c']*>) // 其实是如果匹配到结束标签,从c组移除一个匹配项
上面这几个情况可以重复任意次,于是用(......)*,将它们串起来得到
((?'c']*>)|(?'-c']*>)|([dD]))*
最后,加上头尾的两个标签,最终的正则表达式是:
]*id="test"[^>]*>((?'c']*>)|(?'-c']*>)|([dD]))*
如果 #test 不是 span 而是其他标签,为了匹配到任意标签,可以把span替换成 w+
]*id="test"[^>]*>((?'c']*>)|(?'-c']*>)|([dD]))*
匹配结果是:1
2
3
4
5
6
7
hi~
虫虫
:
早上好。
如果不需要带标签,只要里面的内容,那么加上两个断言
(?<=(]*id="test"[^>]*>))((?'c']*>)|(?'-c']*>)|([dD]))*(?=())
匹配结果是 hi~
虫虫
:
早上好。
说明一下
(?<=表达式) :前面要包含表达式匹配到的项目,但是不会被匹配进去
(?=表达式) :后面要包含表达式匹配到的项目,但是不会被匹配进去
平衡正则 html,正则表达式-利用平衡组匹配html相关推荐
- python正则表达式开头和结尾_Python 基础之正则之一 单字符,多字符匹配及开头结尾匹配...
一.正则表达式之单个字符匹配 格式:lst = re.findall(正则表达式,要匹配的字符串) 预定义字符集 匹配内容 .匹配任意字符,除了换行符\n \d匹配数字 \D匹配非数字 \w匹配字母或 ...
- java正则出现次数_正则表达式(二)—匹配次数的正则
正则表达式 匹配次数的正则 在前一篇文章中,我们总结了和位置相关的正则,在这篇文章中,我们将继续学习正则表达式其它的内容. 假如现在给你一个regular_1.txt文件,让你找出含有连续2个a的行, ...
- matlab读取正则找科学,Matlab正则表达式(递归、匹配上下文等)(转载)
元字符 描述 .点 匹配任何单个字符.例如正则表达式r.t匹配这些字符串:rat.rut.r t,但是不匹配root. $ 匹配行结束符.例如正则表达式weasel$ 能够匹配字符串"He' ...
- java 正则匹配多个_Java正则多次匹配和多次组匹配
关于正则表达式 , 可以学习下这篇介绍 : 正则表达式 对于多次匹配, 正则表达式就需要讲究些技巧了. 替换 单文的多次匹配 有以下几种方式 , 把a全匹配替换 替换 a "aab" ...
- 正则学习(2)--- 简单匹配原理
写写对简单的匹配原理的理解,还是以php为主. 首先,正则引擎主要可分为两大类:DFA和NFA,反正引擎见多了就不奇怪了,简单理解就是不同的匹配方式,就好比在数组中查找数据时,有的是从头开始顺序,查找 ...
- 正则表达式之 NFA 引擎匹配原理详解
文章目录 一.为什么要了解引擎匹配原理 二.正则表达式引擎 三.预备知识 (一)字符串组成 (二)占有字符和零宽度 (三)控制权和传动 四.正则表达式简单匹本过程 (一)基础匹配过程 (二)含有匹配优 ...
- 利用IP组播技术传输视频信息
利用IP组播技术传输视频信息 随着全球互联网(Internet)的迅猛发展,上网人数正以几何级数快速增长,以因特网技术为主导的数据通信在通信业务总量中的比列迅速上升,因特网业务已成为多媒体通信业中 ...
- matlab用之前的计算结果递归,[转载]Matlab正则表达式(递归、匹配上下文等)(转载)...
元字符 描述 .点 匹配任何单个字符.例如正则表达式r.t匹配这些字符串:rat.rut.r t,但是不匹配root. $ 匹配行结束符.例如正则表达式weasel$ 能够匹配字符串"He' ...
- java 字符串正则替换(替换字符串包含匹配到的字符串)
"南风知我意,吹梦到西洲" 很多时候我们需要对文本进行替换,简单地使用replace方法就可以了.复杂的就需要使用正则:java提供了正则相关的类Pattern 和Matcher ...
最新文章
- 友元函数、类的非静态成员函数、静态成员函数的区别
- 竞赛提升:必知必会的21篇论文!
- mysql localhost和127.0.0.1的区别
- 十大经典排序算法之快速排序及其优化
- sas Data步数据读取流程详解
- pdb 调试python
- bomb android实战,android 仿qq app源码下载(bmob)
- node 升级_那些修改node_modules的骚操作
- Open3d之八叉树(Octree)
- pandas 中的模糊匹配
- TurboMail邮件系统促进马可波罗瓷砖集团迅猛发展
- JS获取IP、MAC和主机名的五种方法
- 僵尸网络--botnet--DDoS 章2
- 架构之美-读书笔记之二
- 十款真正的编程游戏软件
- 推荐系统笔记(二):常用数据集Movielens学习
- python图片镜像翻转_OpenCV Python 翻转(镜像)图片 cv.flip
- 瞎聊高速公路与主干道的立交匝道设计
- 3D设计再次证实了“眼见为实”不靠谱
- 腾讯手游助手吃鸡一直服务器繁忙,腾讯手游助手吃鸡手游常见问题解决办法介绍...
热门文章
- 区块链带来的价值包括哪些_爱链社区干货:区块链技术为冷链物流带来的了那些价值?...
- java中蛇的属性有哪些_学习Java类的属性
- Android Retrofit @Streaming 注解失效(二)
- Trie(前缀树/字典树)及其应用
- Linux防火墙命令
- 关于BitmapImage EndInit()时报值不在范围内的异常
- MFC中的消息处理函数
- SSL 1055——能量项链_DP
- iOS 系统版本判断
- 《计算机图形学》2.1.7 立体感和虚拟现实系统