JS中正则表达式

Wesley13
• 阅读 754

正则表达式的定义

js中的正则表达式使用RegExp对象表示,两种创建正则表达式对象的方法

直接量定义

将表达式包含在斜杠之间

var pattern = /js/;

构造函数定义:

使用RegExp()构造函数定义

var pattern = new RegExp('js');

正则表达式中的字符

特殊字符需要转译:使用反斜杠\进行转移

字符类

下为几种常见的字符类

  • [...]在方括号的任意字符
  • [^...]不在方括号内的任意字符
  • . 换行符及其他行终止符之外的任意字符

重复

  • {n,m} 匹配前一项至少n次,最多m次
  • {n,} 匹配前一项n次或者多次
  • {n} 匹配前一项n次
  • ? 匹配前一项0或1次,既前一项可选,既{0,1}
  • + 匹配前一次一次或多次
  • * 匹配前一次0或多次 eg:/[^(]*/匹配非左括号0或多个

非贪婪匹配

尽可能少的匹配,在待匹配的字符后面加?

var p1 = /[a]+/;
var p2 = /[a]+?/;
var str = 'aaaaaaasss';
str.match(p1);  /*["aaaaaaa", index: 0, input: "aaaaaaasss"]*/
str.match(p2); /*["a", index: 0, input: "aaaaaaasss"] 尽可能少的匹配*/

分组和引用

圆括号的作用

  • 把单独的组合合成子表达式

    var p = /java(script)?/ //表示可以有script也可以没有,script为一个子表达式

  • 在完整的模式中定义子模式

    var p1 = /[a-z]+\d+/; var p2 = /[a-z]+(\d+)/; var str = 'abc123456aaa'; str.match(p1); //["abc123456", index: 0, input: "abc123456aaa"] 可以匹配出字符串abc123456 str.match(p2); /* ["abc123456", "123456", index: 0, input: "abc123456aaa"] 可以把子模式(\d+)单独匹配出来*/

  • 允许在同一正则表达式后面引用前面的子表达式

    var p1 = /['"][^'"]*['"]/; //匹配引号之中的文本,不能保证左右匹配 var p2 = /(['"])[^'"]*\1/; //用\n表示第n个圆括号中的子表达式,计数以右边括号的位置为准,\1表示模式匹配的文本的引用,而不是对子表达式的引用,可以保证引号匹配。 var a = ''aaaa'123'; var b = ''aaaa"123'; a.match(p1); ["'aaaa'", index: 0, input: "'aaaa'123"]//正常匹配 a.match(p2); ["'aaaa'", "'", index: 0, input: "'aaaa'123"] //可以匹配出子表达式['"]中对应的字符 ' (\为自己加的转译符) b.match(p1); ["'aaaa"", index: 0, input: "'aaaa"123"]//["'aaaa"", index: 0, input: "'aaaa"123"] 正常匹配 b.match(p2);//null ,因为\1表示第一个组匹配到的文本的引用,既 ' 而不是 "

***不能在字符类中使用这种引用,例如

/['"][^\1]*\1/

这种写法是非法的 ***如果只想分组,但不想分组被编号,可以使用(?: )来进行分组,例如:

var p = /([Jj]ava(?:script)?)\sis\s(fun\w*)/ 
//(?: )中的字符可以被作为分组匹配,但不会进行编号,则\2表示与(fun\w*)匹配的文本

指定位置匹配

  • \b表示单词的边界;\B表示非单词的边界

  • ^表示字符串的开始;$表示字符串的结尾

  • 先行断言,定义在(?= )之间

    var p = /[Jj]ava(script)?(?=:)/; var str1 = 'Javascript:aaa'; var str2 = 'Javascript aaa'; str1.match(p); //["Javascript", "script", index: 0, input: "Javascript:aaa"],匹配成功,但是匹配结果中不包含: str2.match(p); //null,不能匹配,因为先行断言不满足

  • 负向先行断言,定义在(?! )之间,表示字符不匹配XXX

    var p = /[Jj]ava(?!script)[A-Z]\w*/; //表示java后面可以跟大写字母和任意多的ASCII单词,但是不能包含script var str1 = 'javaBean'; var str2 = 'javascript'; var str3 = 'javascripter'; str1.match(p);/["javaBean", index: 0, input: "javaBean"] 匹配成功/ str2.match(p); //null str3.match(p); //null

修饰符

  • i 不区分大小写
  • g 全局匹配
  • m 多行数据中执行匹配

字符串中的正则方法

  • search() 返回第一个与之匹配的字串的位置,如果找不到匹配的字串则返回-1,不支持全局检索,会忽略修饰符g

  • replace() 用于检索与替换,第一个参数为正则表达式,第二个参数为要替换的字符串。 replace() 可用$n表示第n个子表达式,进行匹配替换。

    var p = /"([^"])"/g; text = '1,"2,3","5",4'; text.replace(p, 'A$1A');//1,A2,3A,A5A,4,匹配出所有p相匹配的部分,$1代表([^"])中匹配的结果,并将所有"替换为A

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
JS 对象数组Array 根据对象object key的值排序sort,很风骚哦
有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这