文档章节

JS中正则表达式

王潭不是王雨潭
 王潭不是王雨潭
发布于 2017/09/06 19:13
字数 1080
阅读 19
收藏 0

正则表达式的定义

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

© 著作权归作者所有

共有 人打赏支持
王潭不是王雨潭
粉丝 5
博文 19
码字总数 19745
作品 0
杭州
简单说 正则表达式——要注意lastIndex属性

说明 这篇文章,主要和大家聊聊JavaScript中RegExp对象的属性。 解释 每个RegExp对象都包含5个属性,source、global、ignoreCase、multiline、lastIndex。 source:是一个只读的字符串,包含...

FEWY
2017/07/10
0
0
JavaScript 测试及校验工具

JavaScript 是一款强大的广泛运用于现代Web站点及应用的脚本语言。作为一个技艺精湛的 Web 开发者,掌握JavaScript可以增强用户的使用体验,提供交互及富客户端等功能。 尽管JavaScript 的语...

晨曦之光
2012/03/09
0
0
JavaScript学习记录day9-标准对象

JavaScript学习记录day9-标准对象 [TOC] 在JavaScript的世界里,一切都是对象。 但是某些对象还是和其他对象不太一样。为了区分对象的类型,我们用操作符获取对象的类型,它总是返回一个字符...

ygqygq2
06/11
0
0
js中replace()方法使用注意

1.如果正则表达式中设置了修饰符g,那么源字符串中所有与模式匹配的子串都将替换成第二个参数指定的字符串;如果不带修饰符g,则只替换所有匹配的第一个子串。 2.replace()的第一个参数若是字...

依风听雨
2014/07/10
0
0
JavaScript的简单复习

JavaScript的简单复习 JS的两种加载方式: 1.内部加载 内部加载,写在<script>标签内部 2.外部加载 写在<script>的src目录中,使用外部加载js文件的时候,js解析引擎不解析script标签体中的代码...

Lunqi
2015/08/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Shiro | 实现权限验证完整版

写在前面的话 提及权限,就会想到安全,是一个十分棘手的话题。这里只是作为学校Shiro的一个记录,而不是,权限就应该这样设计之类的。 Shiro框架 1、Shiro是基于Apache开源的强大灵活的开源...

冯文议
今天
1
0
linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
2
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
3
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
15
0
GRASP设计模式

此文参考了这篇博客,建议读者阅读原文。 面向对象(Object-Oriented,OO)是当下软件开发的主流方法。在OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当的粒度归纳...

克虏伯
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部