博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正则表达式
阅读量:7024 次
发布时间:2019-06-28

本文共 3497 字,大约阅读时间需要 11 分钟。

什么是正则表达式

可以通过创建RegExp对象,或者表达式直接量来声明

正则表达式模式规则,是由一个字符序列组成。

正则表达式中有特殊含义的标点

^ $ . * + ? = ! : | \ / ( ) [ ] { }

正则表达式字符类

字符 匹配
[...] 方括号内任意字符
[^...] 不在方括号内的任意字符
. 除了换行符和其他Unicode行终止符之外的任意字符
\w 任意ASCII字符组成的单词,等价于[a-zA-Z0-9]
\W 任意不是ASCII字符组成的单词,等价于[^a-zA-Z0-9]
\s 任何Unicode空白符
\S 任何非Unicode空白符的字符,\w和\S不同
\d 任何ASCII数字,等价于[0-9]
\D 除了ASCII数字之外的任何字符,等价于[^0-9]
[\b] 退格直接量

正则表达式重复字符语法

字符 含义
{n,m} 匹配前一项至少n次,但不能超过m次
{n,} 匹配前一项n次或者更多次
{n} 匹配前一项n次
? 匹配前一项0次或者1次,前一项可选,等价于{0,1}
+ 匹配前一项1次或者更多次,等价于{1,}
* 匹配前一项0次或者多次,等价于{0,}
let reg1 = /\d{2,4}/ //匹配2-4个数字let reg2 = /\w{3}\d?/ //匹配 三个单词和一个可选的数字let reg3 = /\s+java\s+/ //匹配 前后带有1个或多个空格 的 java 字符串let reg4 = /[^(]*/ //匹配一个或多个非左括号的字符复制代码

选择,分组,引用

正则表达式语法还包括指定选择项,子表达式分组和引用前一子表达式特殊字符。

字符“|”用于分隔供选择的字符

let reg1 = /ab|cd|ef/  //可以匹配 ab ,也可以匹配 cd 还可以匹配 eflet reg2 = /\d{3}|[a-z]{4}/ //匹配的是 三位数字 或者 四个连续字母复制代码

选择项尝试匹配的顺序是从左到右,直到发现匹配项。如果左边发现匹配项,则放弃右边。如/a|ab/在匹配 “ab”时,自能匹配 第一个字符。

圆括号有多种作用

  • 一个作用是将 单独的项组合成子表达式,以便可以像处理一个独立单元那样,用“|”,“*”,“+”,“?”等对单元内进行处理。
let reg1 = /java(script)?/  //可以匹配java 后边有没有 script 都可以let reg2 = /(ab|cs)+|ef/ //可以匹配 ef ,也可以匹配 ab 或者 cd 的一次或者多次复制代码
  • 另一个作用是,完整模式中定义子模式。当一个正则表达式成功和目标字符串匹配,可以从目标串中抽出和圆括号子模式相匹配的部分。

假设,我们真正关心的每个匹配尾部的数字,我们可以将模式数字,放在括号中

let reg1 = /[a-z]+\d+/let reg2 = /[a-z]+(\d+)/复制代码
  • 允许在他同意正则表达式的后部引用前面的子表达式 ,通过 ‘\’后面加 一位或多位数字来实现的。这个数字指定带圆括号的子表达式在正则表达式中的位置。

\1 第一个带圆括号的子表达式 \3 第三个带圆括号的子表达式

一个子表达式可以嵌套子表达式,所以位置是参与计数的左括号的位置

// 嵌套的子表达式 ([Ss]cript) 可以用 \2// 第二个左括号let reg1 = /([Jj]ava([Ss]cript)?)\sis\s(fun\w*)/let reg2 = /['"][^'"]*['"]/let reg3 = /['"][^'"]*\1/复制代码

正则表达式 以 “(?:” 和 ”)“进行分组,但这个子表达式只是分组,不能生成引用

/([jJ]ava(?:[Ss]cript)?)\sis\s(fun\W*)/// \2 引用的就是(fun\W*)复制代码

指定匹配位置

正则表达式中的锚字符

字符 含义
^ 匹配字符串的开头,多行检索中,匹配一行的开头
$ 匹配字符串的结尾,多行检索中,匹配一行的结尾
\b 匹配一个单词的边界,就是 位于 \w 和 \W之间的位置,或位于字符 \w 和字符串的开头或结尾之间的位置
\B 匹配非单词边界的位置
// 我们要匹配前后都有空格的 java 字符/\bJava\b///单词边界/\B[Ss]cript/  //这个可以匹配 JavaScript  postscript  但是不匹配 script 和 Scripting复制代码

修饰符

字符 含义
i 执行不区分大小写的匹配
g 执行一个全局匹配,就是要找到所有的匹配
m 多行匹配模式 ^匹配一行的开头和字符串的开头,$ 匹配行的结束和字符串的结束

用于模式匹配的String方法

这里是String对象一些用以执行正则表达式的模式匹配 或者 检索替换的操作方法。

search()

参数是一个正则表达式,返回第一个匹配子串的起始位置,如果找不到,则返回 -1

"Javascript".search(/script/i);//4复制代码

search 不支持 全局搜索,会忽略参数 g

replace()

执行检索和替换。 第一个参数是 一个正则表达式,第二个参数是要进行替换的字符串。 若正则表达式设置了g,原字符串中所有匹配子串将替换成第二个参数指定的字符串。

若replace第一个参数是字符串,不是正则表达式,replace直接搜索这个字符串,并不会将其通过RegExp对象转化为正则表达式。

text.replace(/javascript/gi,'JavaSscipt')复制代码

前文,写了模板字符串的编译方法,出现了 replace $+数字

// 一段引用文起始于引号,结束于引号// 中间的内容区域不能包含引号var quote = /"([^"]*)"/g//用中文半角引号,替换英文引号,同时保留引号之间内容(存储在 $1 中)未被修改tetx.replace(quote,'”$1“')复制代码

match()

唯一参数就是正则表达式(或通过RegExp 对象将其转化为正则表达式),返回时一个由匹配结果组成的数组,如果加了 g ,则返回字符串中所有的匹配结果。

"1 plus 2 equals 3".match(/\d+/g) //["1","2","3"]复制代码

再来看一个例子

var url = /(\w+):\/\/([\w.]+)\/(\S*)/var text = "Welcome to visit my blog at http://www.xxxx.com/legendaryedu"var result = text.match(url)if(result != null){    var fullurl = result[0]    var protocol = result[1]    var host = result[2]    var path = result[3]}复制代码

RegExp对象

两个参数:第一个是正则表达式的直接量,第二个是正则表达式修饰符(可选),只能输入 g i m 或他们的组合

RegExp对象方法

最主要方法是 exex()

对一个指定字符串,执行正则表达式,如果没有任何匹配,返回 null ,匹配到 则 返回数组。

这个数组第一个元素包含的是与正则表达式相匹配的字符串,余下的元素是与圆括号内子表达式相匹配的子串。

var str = "Javascript Java"; var patt = new RegExp("(Ja)?va","g");var result;while ((result = patt.exec(str)) != null)  {  document.write(result);  document.write("
"); document.write(patt.lastIndex); } //15 Java,Ja// 4 Java,Ja// 15复制代码

test()方法,参数是一个字符串,如果包含正则表达式的一个匹配结果,那么返回true

var pattern = /Java/ipattern.test("JavaScript")复制代码

转载于:https://juejin.im/post/5cb16af8e51d456e6c732cac

你可能感兴趣的文章
在ASP.Net和IIS中删除不必要的HTTP响应头[转]
查看>>
爬虫 测试webmagic (一)
查看>>
arm-linux-gdb+gdbserver环境搭建以及远程调试
查看>>
再谈ORACLE CPROCD进程
查看>>
readline库的使用
查看>>
mysql客户端(Navicat)远程登录操作遇到问题1142 - XXX command denied to ×××
查看>>
C# -- 把json字符串转为对象并读取各属性的值
查看>>
MVC5+EF6 入门完整教程五
查看>>
SqlServer一张表数据导入另一张表,收藏使用,工作中更新数据错误很有用
查看>>
基于FormsAuthentication的用户、角色身份认证
查看>>
Quartz定时任务学习(一)简单任务
查看>>
mapreduce程序来实现分类
查看>>
微信接口保存
查看>>
FPGA 状态机设计
查看>>
ASP.NET MVC5---通过QueryString传值
查看>>
C++中的内存管理
查看>>
Bootstrap系列 -- 27. 下拉菜单对齐方式
查看>>
关于 android百度地图 调用 地理位置 经纬度坐标,只调用一次的解决方法,通知栏不总是 搜索 GPS 。。。...
查看>>
Oracle 创建 DBLink 的方法
查看>>
后Hadoop时代的大数据架构(转)
查看>>