Javascript正则表达式基础
作者:lunaticsun 来源:Alipay UED 发布时间:2009-02-01 18:13:00
RegExp对象的语义和使用:
检查字符串匹配
获取字符串中的部分内容
在原字符串的基础上构建一个新的字符串(包括添加、删除和修改)
构建一个RegExp对象主要有两种方法:
使用literal,如/\w/g
使用构造函数,如 new RegExp(/\w/)
构建RegExp对象有以下几个注意点:
literal常用来构建非runtime产生的静态的RegExp对象
literal之后可以直接添加flag用来对匹配字符串的执行结果进行限制,常用flag包括g和i,分别用来表示全局匹配(global)和忽略大小写匹配(case-insensitive)
RegExp构造函数的第一个参数提供该对象的pattern,如果pattern是一个RegExp literal,那么就不能提供第二个参数(即指定flag)。如果pattern是一个string,那么可以使用第二个参数
RegExp构造函数常用于构建runtime产生的动态RegExp对象
RegExp的pattern为string时所有literal中的”\”都必须写成”\\”,因为”\”在string中需要被转义
以上两种方法构建的都一个javascript对象,因此/\w/ == /\w/返回false
RegExp对象相关的功能:
要检查字符串的匹配,可以使用 regExp.test(string) 方法,该方法检查string是否匹配regExp提供的pattern。还可以使用 string.search(regExp)方法,如果两者不匹配将会返回-1
要获取字符串中的部分内容,可以使用 regExp.exec(string) 方法,也可以使用string.match(regExp)方法
要在原有字符串上构建一个新的字符串,通常使用string.replace(searchValue, replaceValue)方法
RegExp对象中提供pattern的语义:
RegExp可以定义多个Alternative用”|”分割,该运算的优先级最低,因此如果存在”|”,那么它首先把RegExp分割成几大部分
每个Alternative由多个term组成,term分为assertion(用于位置限定),atom(匹配的单元),带Quantifier(修饰符)的atom
assertion分为”^”用于匹配字符串开头,在multiInput(即flag包含m时),也可以匹配一行的开头,”$”用于匹配字符串结尾,在multiInput(即flag包含m时),也可以匹配一行的结尾,”\b”用于匹配一个\w和\W间隔,注意它并不匹配任何字符串中的内容,而只是用来判断一个位置的匹配情况
atom的情况比较复杂,我们首先来看atom的Quantifier,可以包含* + ? {n} {m,} {m,n},其中*表示atom可以有0次或以上的重复,+表示1次或以上的重复,?表示0或1次,{n}表示恰巧n次重复,{m,}表示m或以上的重复,{m,n}表示重复次数在m和n之间(包含m和n),在以上的Quantifier之后还可以跟一个?用来启动non-greedy模式,我将在后文中说明这种模式的意义。
atom包含patternCharacter(普通字符,即在pattern中没有特殊语义的字符,匹配时将按照字面进行匹配)
“.” 匹配所有非line-terminator字符
\AtomEscape 包含数字型 \1(用于引用之前的括号中的匹配成功的内容)。一些字符的引用\n \f \r \t \v \xNN \uXXXX \cX等。一些特殊含义的字符,如\d \D \s \S \w \W
CharacterClass,包含[...]和[^...]两种形式。其中可以包含很多字符,如-、 \n等字符引用、\b、\d等特殊含义字符。注意如果”-”左右有字符,那么语义变为从某一字符到某一字符。如果”-”左或者右没有字符,那么”-”仅表示dash字符。
(group),以上模式进行group就可以在group之后使用Quantifier修饰
(?:group),仅作为group使用,而不会记录group匹配的内容从而不算在\1..\n中
(?=group),要求匹配但不会在返回的匹配string中包含group匹配的内容
(?!group),要求不匹配且不会在返回的匹配string中包含group匹配的内容
下面我要讲一下RegExp的两个比较重要的运作模式:
匹配Alternative总是从左到右,如果遇到第一个匹配的就不再尝试之后的匹配,如
/ab|abc/.exec("abc")
以上字符串”abc”仅匹配pattern中的ab,而不会去匹配abc
匹配时总是一般不在Quantifier后添加?的都使用greedy模式,添加?后使用non-greedy模式,如
/\w+bc/.exec("abcbcbc")
匹配时\w+总是先尽可能多的匹配(即greedy模式),因此它会匹配”abcbcbc”,如果改为
/\w+?bc/.exec("abcbcbc")
那么他会尽可能少的匹配(即non-greedy模式),因此仅匹配”abc”。
对于一般的解析字符串的要求,一般可以使用exec或match方法解析,如果字符串很大那么往往需要使用循环结构进行解析,配合while等语句,RegExp是很强大的。
对于要将现有的一个字符串通过修改转变为另一个字符串时,一般总是使用replace方法,这个方法是我觉得RegExp中最重要的方法,它的多态性使他具有多种形式,几乎能够满足所有修改字符串的需求。


猜你喜欢
- 如果是在Oracle10g之前,删除一个表空间中的数据文件后,其文件在数据库数据字典中会仍然存在,除非你删除表空间,否则文件信息不会清除。但
- 今天在我的Centos6.5机器上安装 Django 开发环境,在安装完使用 “django-admin.py startproject m
- 一、乱码的原因:1、 client客户端的编码不是utf82、server端的编码不是utf83、database数据库的编码不是utf84
- 本文是在上篇文章Python中的type和object,做的补充,希望大家喜欢。这篇博客主要描述Python的新风格对象(new-style
- 从微信小程序官方发布的公告中我们可获知:小程序体验版、开发版调用 wx.getUserInfo 接口,将无法弹出授权询问框,默认调用失败,需
- 一、简介抠图是用PS?用魔棒和快速选择工具?遇到复杂背景怎么办?最近发现一个神奇的工具——Remove Image Backgroundht
- 第一种方法:这个是删除单字段图片的代码。比较简单,因为图片字段已经预先存在数据库表的bookpic的字段里面了。 代码如下: <!-
- 基于OpenCV2.4.8和 python 2.7实现简单的手势识别。以下为基本步骤 1.去除背景,提取手的轮廓2. RGB->YUV
- 本文实例讲述了Vue插槽原理与用法。分享给大家供大家参考,具体如下:1 插槽内容Vue 实现了一套内容分发的 API,这套 API 基于当前
- 窗口的透视变换效果 当我们点击Win10的UWP应用中的小部件时,会发现小部件会朝着鼠标点击位置凹陷下去,而且不同的点击位置对应着不同的
- 作者认为最快的学习区块链的方式是自己创建一个,本文就跟随作者用Python来创建一个区块链。对数字货币的崛起感到新奇的我们,并且想知道其背后
- 很多朋友在论坛和留言区域问mysql在什么情况下才需要进行分库分表,以及采用何种设计方式才是最优的选择,根据这些问题,小编为大家整理了关于M
- 作为k8s官方维护的客户端,k8s go-client对于go语言中使用k8s可以说是唯一选项。但是官方的使用示例我个人觉得并不是很清晰,尤
- 作者:HelloGitHub-追梦人物文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库当博客上发布的文章越来越多时
- 使用axios发送post请求出现400错误出现400状态码主要有两种原因1.bad request:“错误的请求&qu
- DateDiff(timeinterval,date1,date2 [, firstdayofweek [, firstweekofyear
- 本文实例讲述了Python使用try except处理程序异常的三种常用方法。分享给大家供大家参考,具体如下:如果你在写python程序时遇
- Python 实现微信小程序的用户登录小程序可以通过官方提供的登录邓丽来获取用户身份的标示, 具体文档可以参考 官方文档, 通过流程时序可以
- 类常量是PHP面向对象程序设计中非常重要的一个概念,牢固掌握类常量有助于进一步提高PHP面向对象程序设计的水平。本文即以实例形式描述了PHP
- 从实时视频流中识别出人脸区域,从原理上看,其依然属于机器学习的领域之一,本质上与谷歌利用深度学习识别出猫没有什么区别。程序通过大量的人脸图片