侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

仅1个例子轻松学习正则表达式

前端  /  管理员 发布于 7年前   329

正则表达式的语法就不多说了,大家可以自己搜索查阅相关资料学习。本文所举例子是在《JavaScript语言精粹》上看到的,看完之后对正则表达式有了进一步的理解,故分享之。

例子

//这是一个用来匹配URL的正则表达式,分组获取不同部分的信息var parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;var url = "http://www.ora.com:80/goodparts?q#fragment";var result = parse_url.exec(url);var names = ["url", "scheme", "slash", "host", "port", "path", "query", "hash"];var i;for (i = 0; i < names.length; i++) { document.writeln(names[i] + ": " + result[i] + "<br/>");}//这段代码的输出结果如下:url: http://www.ora.com:80/goodparts?q#fragmentscheme: httpslash: //host: www.ora.comport: 80path: goodpartsquery: qhash: fragment

解析
下面让我们分解parse_url的各个部分,看看它是如何工作的:

^

^字符表示此字符串的开始,它是一个锚,指引exec不要跳过那些不像URL的前缀,只匹配那些从开头就像URL一样的字符串。

(?:([A-Za-z]+):)?

这个因子匹配一个协议名,但仅当它后面跟随一个 :(冒号)的时候才匹配。(?: . . .)表示一个非捕获型分组(noncapturing group)。后缀 ? 表示这个分组是可选的,它表示重复0次或1次。( . . .)表示一个捕获型分组。一个捕获型分组会复制它所匹配的文本,并把其放到result数组里。每个捕获型分组都会被指定一个编号。第一个捕获型分组的编号是1,所以该分组所匹配的文本副本会出现在result[1]中。 [ . . .]表示一个字符类。A-Za-z这个字符类包含26个大写字母和26个小写字母。连接字符 - 表示范围从A-Z。后缀 + 表示这个字符类会被匹配一次或多次。这个组后面跟着字符 : ,它会按字面进行匹配。 

(\/{0,3})

这个因子是捕获型分组2,匹配//。\ /表示应,该匹配 / (斜杠)。它用 \ (反斜杠)来进行转义,这样它就不会被错误地解释为这个正则表达式的结束符。后缀 {0,3} 表示 / 会匹配0~3次。

([0-9.\-A-Za-z]+)

这个因子是捕获型分组3。它会匹配一个主机名,由一个或多个数字、字母以及 . 或 - 字符组成。- 会被转义为 \- 以防止与表示范围的连字符相混淆。

(?::(\d+))?

这个可选的因子匹配端口号,它是由一个前置 : 加上一个或多个数字而组成的序列。\d表示一个数字字符。一个或多个数字组成的数字串会被捕获型分组4捕获。

(?:\/([^?#]*))?

这个因子也是可选的分组,匹配路径。该分组以一个 / 开始。之后的字符类[^?#]以一个^开始,它表示这个类包含除 ? 和 # 之外的所有字符。* 表示这个字符类会被匹配0次或多次。

注意我在这里的处理是不严谨的。这个类匹配除 ? 和 # 之外的所有字符,其中包括了行结束符、控制字符、以及其他大量不应在此被匹配的字符。大多数情况下,它会按照我们的预期去做,但某些恶意文本可能会有渗漏进来的风险。不严谨的正则表示式是一个常见的安全漏洞发源地。写不严谨的正则表达式比写严谨的正则表示式要容易的多。 

(?:\?([^#]*))?

这个因子是一个以一个 ? 开始的可选分组。它包含捕获型分组6,这个分组包含0个或多个非#字符。

(?:#(.*))?

这个因子是以 # 开始的可选分组。. 会匹配除行结束符以外的所有字符。

$

$表示这个字符串的结束。它保证在这个URL的尾部没有其他更多的内容了。

通过这个简单例子,相信大家对正则表达式有了更进一步的理解,祝大家学习愉快!


  • 上一条:
    最全的常用正则表达式大全
    下一条:
    MyEclipse删除网上复制下来的来代码带有的行号(正则去除行号)
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客