程序员

如何使用正则匹配最后一个字符串详解

作者:admin 2021-08-06 我要评论

前几天遇到一个需求,输入的是 user user namea/name /user user namea/name /user/userpassword123/password 要求拿到 user user namea/name /user user namea/...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

前几天遇到一个需求,输入的是

<user>
    <user>
        <name>a</name>
    </user>
    <user>
        <name>a</name>
    </user>
</user>
<password>123</password>

要求拿到

<user>
    <user>
        <name>a</name>
    </user>
    <user>
        <name>a</name>
    </user>
</user>

也就是去掉最后一个</user>后面的字符串。

方法有很多,我首先想到的是用正则匹配去掉</user>后面的字符串。

最后写出来的表达式是(?<=</user>)(?![\w\W]*</user>)[\w\W]+

首先用(?<=</user>)匹配所有前面是</user>的位置,如图,总共有三个位置。

这里写图片描述

这里我们正则表达式(?<=</user>)的意思就是匹配的位置之前的字符串是</user>,也就是我们匹配到的位置在</user>之后。

这里用到了正则表达式语法中的断言,有的书上也称该语法为预查或者环视,都是一样的用法。有如下语法:
(?=pattern) 零宽正向先行断言 (?!pattern) 零宽负向先行断言 (?<=pattern) 零宽正向后行断言 (?<!pattern) 零宽负向后行断言

这里用到的是(?<=pattern),零宽表示它匹配的是在字符串中的位置,如同^匹配字符串串首,$匹配字符串串尾。正向代表它必须满足pattern。后行代表它匹配的位置在pattern之后。

^匹配字符串串首

其次,再这三个位置上进行筛选,能够看出这三个位置的区别是后面是否有</user>,如果没有的话那么它就是最后一个</user>后面的位置。在之前的表达式后面添上(?![\w\W]*?</user>)此时表达式变为(?<=</user>)(?![\w\W]*?</user>)

这里写图片描述

能够看到得到了最后一个匹配结果。

这里的正则表达式(?!pattern) 是零宽负向先行断言,也就是它会往后匹配pattern,匹配到的位置在pattern之前,并且匹配到的字符串必须不满足pattern。

(?![\w\W]*?</user>)的意思是在匹配到的位置后面必须不是[\w\W]*?</user>,\w匹配的是[a-zA-Z0-9_]即匹配字母数字和下划线,而\W匹配的是[^a-zA-Z0-9_]即不是字母数字也不是下划线的字符,同时匹配这两个就相当于匹配任意字符。[\w\W]后面的*代表匹配0-任意多次,后面的?代表懒惰模式,即只要满足条件就立即返回。

最后,在之前的正则表达式后面加上[\w\W]+贪婪匹配即尽可能多的匹配该位置后面的字符串。最终的正则表达式是(?<=</user>)(?![\w\W]*?</user>)[\w\W]*

这里写图片描述

最后的最后用四张图简单地描述四种断言的不同之处。

这里输入的字符串都是123456。

(?=3),它匹配的位置是后面的字符为3的位置。

这里写图片描述 

(?<=3),它匹配的位置是前面的字符为3的位置。

这里写图片描述 

(?!3)匹配的位置是后面的字符不为3的位置,可以看到箭头所指的地方没有被匹配到,其他位置都被匹配到了。

这里写图片描述

(?<!3)匹配的位置是前面的字符不为3的位置,可以看到箭头所指的地方没有被匹配到,其他位置都被匹配到了。

这里写图片描述

总结

到此这篇关于如何使用正则匹配最后一个字符串详解的文章就介绍到这了,更多相关正则匹配最后一个字符串内容请搜索站长技术以前的文章或继续浏览下面的相关文章希望大家以后多多支持站长技术!


原文链接:https://m.jb51.net/article/209512.htm

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 十月更新修复了Windows 10的Ping of De

    十月更新修复了Windows 10的Ping of De

  • Windows10 UAC弹窗太烦但又不能关?教

    Windows10 UAC弹窗太烦但又不能关?教

  • 老大手把手教我玩 Git 变基!

    老大手把手教我玩 Git 变基!

  • 在Linux终端中展示幻灯片

    在Linux终端中展示幻灯片