热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于正则表达式的一些笔记整理

基础知识一元字符\b单词边界\d数字[0-9]\w英文数字下划线[a-z0-9_]\s空白字符[\t\v\n\r\f]\t水平制表符,\v垂直制表符,\n换行符,\r回车符,\f换

基础知识

一 元字符

\b 单词边界
\d 数字 [0-9]
\w 英文 数字 下划线 [a-z0-9_]
\s 空白字符[\t\v\n\r\f] \t水平制表符,\v垂直制表符,\n换行符,\r回车符,\f换页符
反义
\B 非单词边界
\D [^0-9]
\W [^a-z0-9_]
\S 非空白字符 [^\t\v\n\r\f]
. 任意字符 少用
.* 任意数量的不包含换行的字符 贪婪匹配
.? 懒惰 非贪婪匹配
\u4e00-\u9fa5 中文

二 量词

{m,n} 匹配m-n次,优先匹配m次
{n,} 匹配n或以上次
{n} 匹配n次
? 0或1,有或无 等于{0,1}
+ 1或以上等于{1,}
* 0或n都可以 任意 等于{0,}
eg:
/\d?/ //匹配1或0个数字
/\d{2,4}/ //匹配2到4个数字
/\s+java\s+/ //匹配有1个或多个空格的字符串java
/[^(]*/ //匹配1个或多个左括号

三 集合 字符类

[abc] 匹配a/b/c任意字符
[^abc] 匹配除了abc外的任意字符
[a-z] 匹配a到z任意字符
//注意:里面的-代表的是范围 例如
'ahd-fj-k'.replace(/[a-z]/g,'A') //输出 》#-AA-A
//如果我想把斜杠也替换了呢 有两个方法
1. 利用转义符\
'ahd-fj-k'.replace(/[a-z\-]/g,'B') //输出BBBBBBBB
2. 后面加多一个-
'ahd-fj-k'.replace(/[a-z\-]/g,'B') //输出BBBBBBBB
//() 在集合里面默认被转义了 like this
//'(122)do('.replace(/[(\d)]/g,'A') 输出 #AAdoA
//具体被转义范围不确定 欢迎普及补充

四 分支

123|34|567 //匹配123或34或567

五 边界 开始结束

^ //代表开始 在[]代表非
$ //代表结束

六 修饰符

g //全局匹配 不写的话匹配完第一个就停止
i //忽略大小写
m //忽略换行
//上面3可叠加使用

七 贪婪模式和非贪婪模式
js默认贪婪模式 即最大可能的匹配
想要改成非贪婪模式在后面加个?

例子:
'123456789'.replace(/\d{3,6}/,'XX') //输出XX
//贪婪模式先匹配了最多的 6个数字》X 剩下3个数字也算是符合就再多一个X
'123456789'.replace(/\d{3,6}?/,'XX') //输出XXX
//非贪婪模式 优先匹配了最低要求的3个数字一次 〉 3个X

八 分组与引用与捕获
分组是正则中非常强大的功能 可以让上面提到的量词作用与一组字符。
语法 圆括号包裹(*);
《关于正则表达式的一些笔记整理》
《关于正则表达式的一些笔记整理》

/([0-9])[a-z]+\1{3}/.test('2aa222') //true
/([0-9]+)[a-z]+\1/.test('12aa12') //true
/([0-9]+)[a-z]+\1/.test('12aa13') //false
//这里需要注意一个问题。分组"\1"表示的并不是多个数字,而是和对应分组一模一样的数字
/<([a-z]+)>.*<\/\1>/.test('sdlk

sdjks
sdkl')
// true

并不是所有用()起来的就能被捕抓成为分组的。
下面就要说到 非捕抓分组可以提高性能和简化逻辑
用法:

**(***) //识别成为可捕抓分组
(?:***) //识别成为非捕抓分组**
例子:
把a1b2c3d4里面的数字都+1
'a1b2c3d4'.replace(/(\d)/g,function($1){
return $1*1+1
})
//输出 a2b3c4d5
把2015-12-25 格式成 12月25日2015年
'2015-12-25'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2月$3日$1年')
//输出 12月25日2015年
非捕抓例子:
'2015-12-25'.replace(/(\d{4})-(?:\d{2})-(\d{2})/g,'$2月$3日$1年')
//第二个()里面有?: 所以它不被捕抓成分组。 于是$1对应着2015, $2对应着25
//输出 25月$3日2015年

九 前瞻
正则表达式从文本头部想稳步开始解析,文本尾部方向,称为“前”。
简单理解为 从左到右

前瞻就是 向前检查是否属于断言
后顾/后瞻方向相反 但是Javascript不支持后瞻。

《关于正则表达式的一些笔记整理》

《关于正则表达式的一些笔记整理》

正向前瞻 例子:
'a2*3w4sb'.replace(/\w(?=\d)/g,'X') //输出X2*3X4sb
//主角是\w 只对它进行匹配。
//(?=\d)这个就是断言 就是条件。只是条件不参与匹配
//找\w (英文|数字|下划线) 而且后面跟着\d 数字的。
//所以符合的有 a2的a w4的w;
负向前瞻 例子:
'a2*3w4sb'.replace(/\w(?!\d)/g,'X') //输出 aX*XwXX
//主角是\w 只对它进行匹配。
//(?!\d)这个就是断言 就是条件。只是条件不参与匹配
//找\w (英文|数字|下划线) 而且后面不是\d 数字的。
//所以符合的有 2*的2 3w的3 4s的4 sb的s b后面什么都没跟所以符合;

调用方法

Js风格 调用RegExp对象的构造函数
var reg = new RegExp('^[a-z]+[0-9]$', 'gi')
Perl风格 写在斜杠中
var reg = /^[a-z]+[0-9]$/gi

常用

    • test 返回布尔值

      例子:
      /^\d+$/.test('12637') //true
      /^\d+$/.test('sdk') //false

    • search 返回搜索到的对应位置 没有则-1

      //注意 search只查找一次,即使设置了g。重复调用也是从起始位置开始

      例子
      'ad1cd2c'.search(/\d/g) //2 第一个数字的位置
      'adcd'.search(/\d/g) //-1 找不到

    • replace 替换

      ('a1b2c3').replace(/\d/g,'数字') //a数字b数字c数字

    • split 分割成数组 里面也能写正则。 如果找不到匹配分割的把自己变数组

      'a12b23c34'.split('1') //["a", "2b23c34"]
      'a12b23c34'.split(/\d{2}/g) //["a", "b", "c", ""]
      'a12b23c34'.split(/[23]/g) //["a1", "b", "", "c", "4"]
      'a12b23c34'.split(/[55]/g) //["a12b23c34"]

    • match 与 exec 返回数组 匹配到的字符串

      两者相似又不同。 写法上不一样

      match是字符串方法,写法为:str.match(reg)
      exec是正则表达式方法,写法为:reg.exec(str)

      写法:
      var reg = new RegExp("abc") ;
      var str = "3abc4,5abc6";
      str.match(reg);
      var reg = new RegExp("abc") ;
      var str = "3abc4,5abc6";
      reg.exec(str );
      ---------------------------------------
      无子表达式非全局时:
      **exec和match执行的结果是一样,均返回第一个匹配的字符串内容;**
      var reg = new RegExp("[a-z]+") ;
      var str = "1abc2,3abc4";
      alert(str.match(reg));
      alert(reg.exec(str));
      //都是输出 abc
      无子表达式全局匹配 :
      **match执行了全局匹配查询;exec找到一个匹配即返回。**
      var reg = new RegExp("[a-z]+","g") ;
      var str = "1abc2,3bcd4";
      console.log(str.match(reg)); //["abc", "bcd"]
      console.log(str.match(reg)); //["abc", "bcd"]
      console.log(reg.exec(str)); //["abc"]
      console.log(reg.exec(str)); //["bcd"]
      //match执行了全局匹配查询;而exec逐次返回。
      有子表达式 非全局:
      **match exec 都是返回结果 和分组**
      var reg = new RegExp("a(bc)") ;
      var str = "3abc4,5abc6";
      console.log(str.match(reg)); //["abc", "bc"]
      console.log(reg.exec(str)); //["abc", "bc"]
      有子表达式 全局:
      **match忽略子表达式,只查找全匹配正则表达式并返回所有内容;
      exec 依然逐次返回结果 分组
      **
      var reg = new RegExp("a(bc)","g") ;
      var str = "3abc4,5abc6";
      console.log(str.match(reg)); // ["abc", "abc"]
      console.log(str.match(reg)); // ["abc", "abc"]
      console.log(reg.exec(str)); // ["abc", "bc", index: 1]
      console.log(reg.exec(str)); // ["abc", "bc", index: 7]

    随手简单正则

    /^\d+$/.test('2l') //只能输入数字
    /^\d{n}$/.test('2222') //只能输入n个数字
    /^\d{n,}$/.test('22222') //只能输入n个以上数字
    /^\d{m,n}$/.test('22222') //只能输入m到n个数字
    /^[a-z]+$/i //只能输入英文
    /^[A-Z]+$/.test('SS’) //只能输入大写英文
    /^[0-9a-z]+$/i.test('1223ddsSSk') //只能输入英文和数字
    /^\w+$/.test('wS233_') //只能英文数字下划线
    /^[\u4e00-\u9fa5]+$/.test('大家看') //纯中文
    //匹配手机号 : 手机号 1开头 34568 第二位 数字任意9位
    /^1[3|4|5|6|8]{1}\d{9}$/.test('13347834892')
    //匹配日期格式 YYYY-MM-DD
    1/2开头 3个数字 - [0|1][1-9] - [0-1][1-9]
    /^[1-9]\d{3}-[0-1]\d-[0-3]\d$/.test('2017-12-20')
    //过滤html标签: 以<开头 >结尾的标签
    '幕中闪着凶光。

    索拉卡'.replace(/<[^<>]+>/g,'')
    //简单版匹配email邮箱:英文数字下划线 @ 英文数字 .com
    /^\w+\@[a-z0-9]+(.com)$/.test('@qq.com')
    // 网上看到的Email地址:
    ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

    《关于正则表达式的一些笔记整理》

    有很多在线正则可视化的网站也是很有意思 写了可以拷贝进去检查看看。
    点击跳转去正则可视化网页

    mark一下 仅供参考 欢迎更正补充 end


    推荐阅读
    • 正则表达式及其范例
      为什么80%的码农都做不了架构师?一、前言部分控制台输入的字符串,编译成java字符串之后才送进内存,比如控制台打\, ... [详细]
    • Python爬虫中使用正则表达式的方法和注意事项
      本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
    • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
    • HTML5网页模板怎么加百度统计?
      本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
    • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
    • 如何优化Webpack打包后的代码分割
      本文介绍了如何通过优化Webpack的代码分割来减小打包后的文件大小。主要包括拆分业务逻辑代码和引入第三方包的代码、配置Webpack插件、异步代码的处理、代码分割重命名、配置vendors和cacheGroups等方面的内容。通过合理配置和优化,可以有效减小打包后的文件大小,提高应用的加载速度。 ... [详细]
    • 基于php常用正则表达式的整理汇总【PHP】
      后端开发|php教程php,常用正则表达式后端开发-php教程正则表达式3m互助直销系统源码,传感器ubuntu,在家无聊如何爬虫,phpuniquid,康华seo推广lzw如下所 ... [详细]
    • 本文讨论了一个关于正则的困惑,即为什么一个函数会获取parent下所有的节点。同时提出了问题是否是正则表达式写错了。 ... [详细]
    • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
    • Python正则表达式学习记录及常用方法
      本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
    • 《数据结构》学习笔记3——串匹配算法性能评估
      本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
    • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
      本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
    • 小程序wxs中的时间格式化以及格式化时间和date时间互转
      本文介绍了在小程序wxs中进行时间格式化操作的问题,并提供了解决方法。同时还介绍了格式化时间和date时间的互相转换的方法。 ... [详细]
    • 前言:拿到一个案例,去分析:它该是做分类还是做回归,哪部分该做分类,哪部分该做回归,哪部分该做优化,它们的目标值分别是什么。再挑影响因素,哪些和分类有关的影响因素,哪些和回归有关的 ... [详细]
    • 获取时间的函数js代码,js获取时区代码
      本文目录一览:1、js获取服务器时间(动态)2 ... [详细]
    author-avatar
    兰州老头_337
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有