网站建设知识

我们将想法与焦点与您一起共享

当前位置:深圳网站建设 > 网站建设知识> 深圳网站建设|正则表达式理(lǐ)论篇

深圳网站建设|正则表达式理(lǐ)论篇

2017-6-5 17:28:44 独占网络 网站建设知识
學(xué)习正则表达式的你们,有(yǒu)没有(yǒu)发现,一开始总是记不住语法。嗯,加深大家的印象的同时,我也是来找同道中(zhōng)人的。

先你要记住它的名(míng)字

正则表达式
regular expression
缩写 regexp 、regex 、egrep。

正则表达式可(kě)以干嘛

数据验证。
复杂的字符串搜寻、替换。
基于模式匹配从字符串中(zhōng)提取子字符串。
概述

正则表达式包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称為(wèi)“元字符”)。

若要匹配这些特殊字符,必须先转义字符,即,在字符前面加反斜杠字符 \**。
例如,若要搜索 “+”文(wén)本字符,可(kě)使用(yòng)表达式 \+。
但是大多(duō)数 特殊字符 在中(zhōng)括号表达式内出现时失去本来的意义,并恢复為(wèi)普通字符。

构造函数(四种写法)

JavaScript

var regex = new RegExp('xyz', 'i');
var regex = new RegExp(/xyz/i);
var regex = /xyz/i;
 
// ES6的写法。ES5在个参数是正则时,不允许此时使用(yòng)第二个参数,会报错。
// 返回的正则表达式会忽略原有(yǒu)的正则表达式的修饰符,只使用(yòng)新(xīn)指定的修饰符。
// 下面代码返回”i”。
new RegExp(/abc/ig, 'i').flags 
用(yòng)于模式匹配的String方法

String.search()
参数:要搜索的子字符串,或者一个正则表达式。
返回:个与参数匹配的子串的起始位置,如果找不到,返回-1。
说明:不支持全局搜索,如果参数是字符串,会先通过RegExp构造函数转换成正则表达式。
String.replace()
作(zuò)用(yòng):查找并替换字符串。
个参数:字符串或正则表达式,
第二个参数:要进行替换的字符串,也可(kě)以是函数。
用(yòng)法:
替换文(wén)本中(zhōng)的$字符有(yǒu)特殊含义:

JavaScript

$1、$2、...、$99 与 regexp 中(zhōng)的第 1 到第 99 个子表达式相匹配的文(wén)本。
$& 与 regexp 相匹配的子串。
$` 位于匹配子串左侧的文(wén)本。
$' 位于匹配子串右侧的文(wén)本。
$$ 普通字符$。
 
如:

JavaScript

'abc'.replace(/b/g, "{$$$`$&$'}")
// 结果為(wèi) "a{$abc}c",即把b换成了{$abc} 
String.match()
参数:要搜索的子字符串,或者一个正则表达式。
返回:一个由匹配结果组成的数组。
非全局检索:如果没有(yǒu)找到任何匹配的文(wén)本返回null;否则数组的个元素是匹配的字符串,剩下的是小(xiǎo)括号中(zhōng)的子表达式,即a[n]中(zhōng)存放的是$n的内容。非全局检索返回三个属性:length 属性;index 属性声明的是匹配文(wén)本的个字符的位置;input 属性则存放的是被检索的字符串 string。

全局检索:设置标志(zhì)g则返回所有(yǒu)匹配子字符串,即不提供与子表达式相关的信息。没有(yǒu) index 属性或 input 属性。

 

String.split()
作(zuò)用(yòng):把一个字符串分(fēn)割成字符串数组。
参数:正则表达式或字符串。
返回:子串组成的数组。
RegExp的方法

RegExpObject.exec()
参数:字符串。
返回:
非全局检索:与String.macth()非全局检索相同,返回一个数组或null。

全局检索:尽管是全局匹配的正则表达式,但是exec方法只对指定的字符串进行一次匹配。但是可(kě)以反复调用(yòng)来实现全局检索。在 RegExpObject 的lastIndex 属性指定的字符处开始检索字符串;匹配后,将更新(xīn)lastIndex為(wèi)匹配文(wén)本的后一个字符的下一个位置;再也找不到匹配的文(wén)本时,将返回null,并把 lastIndex 属性重置為(wèi) 0。

如:

exec_g

RegExpObject.test()
参数:字符串。
返回:true或false。
RegExpObject.toString()
返回:字符串
字符

| 指示在两个或多(duō)个项之间进行选择。类似js中(zhōng)的或,又(yòu)称分(fēn)支条件。
/ 正则表达式模式的开始或结尾。
\ 反斜杠字符,用(yòng)来转义。
- 连字符 当且仅当在字符组[]的内部表示一个范围,比如[A-Z]就是表示范围从A到Z;如果需要在字符组里面表示普通字符-,放在字符组的开头即可(kě)。

. 匹配除换行符 \n 之外的任何单个字符。
\d 等价[0-9],匹配0到9字符。
\D 等价[^0-9],与\d相反。
\w 与以下任意字符匹配:A-Z、a-z、0-9 和下划線(xiàn),等价于 [A-Za-z0-9]。
\W 与\w相反,即 [^A-Za-z0-9]

限定符(量词字符)

显示限定符位于大括号 {} 中(zhōng),并包含指示出现次数上下限的数值;*+? 这三个字符属于单字符限定符:

{n} 正好匹配 n 次。
{n,} 至少匹配 n 次。
{n,m} 匹配至少 n 次,至多(duō) m 次。
* 等价{0,}
+ 等价{1,}
? 等价{0,1}

注意:

显示限定符中(zhōng),逗号和数字之间不能(néng)有(yǒu)空格,否则返回null!
贪婪量词*和+:javascript默认是贪婪匹配,也就是说匹配重复字符是尽可(kě)能(néng)多(duō)地匹配。
惰性(少重复匹配)量词?:当进行非贪婪匹配,只需要在待匹配的字符后面跟随一个?即可(kě)。
JavaScript

var reg = /a+/;
var reg2 = /a+?/;
var str = 'aaab';
 
str.match(reg); // ["aaa"]
str.match(reg2); // ["a"] 
定位点(锚字符、边界)

^ 匹配开始的位置。将 ^ 用(yòng)作(zuò)括号[]表达式中(zhōng)的个字符,则会对字符集求反。
$ 匹配结尾的位置。
\b 与一个字边界匹配,如er\b 与“never”中(zhōng)的“er”匹配,但与“verb”中(zhōng)的“er”不匹配。
\B 非边界字匹配。

标记

中(zhōng)括号[] 字符组;标记括号表达式的开始和结尾,起到的作(zuò)用(yòng)是匹配这个或者匹配那个。
[...] 匹配方括号内任意字符。很(hěn)多(duō)字符在[]都会失去本来的意义:[^...]匹配不在方括号内的任意字符;[?.]匹配普通的问号和点号。
但是不要滥用(yòng)字符组这个失去意义的特性,比如不要使用(yòng)[.]来代替\:转义点号,因為(wèi)需要付出处理(lǐ)字符组的代价。
大括号{} 标记限定符表达式的开始和结尾。
小(xiǎo)括号() 标记子表达式的开始和结尾,主要作(zuò)用(yòng)是分(fēn)组,对内容进行區(qū)分(fēn)。
(模式) 可(kě)以记住和这个模式匹配的匹配项(捕获分(fēn)组)。不要滥用(yòng)括号,如果不需要保存子表达式,可(kě)使用(yòng)非捕获型括号(?:)来进行性能(néng)优化。
(?:模式) 与模式 匹配,但不保存匹配项(非捕获分(fēn)组)。
(?=模式) 零宽正向先行断言,要求匹配与模式 匹配的搜索字符串。 找到一个匹配项后,将在匹配文(wén)本之前开始搜索下一个匹配项;但不会保存匹配项。
(?!模式) 零宽负向先行断言,要求匹配与模式 不匹配的搜索字符串。 找到一个匹配项后,将在匹配文(wén)本之前开始搜索下一个匹配项;但不会保存匹配项。

有(yǒu)点晕?
好,换个说法。。。

先行断言(?=模式):x只有(yǒu)在y前面才匹配,必须写成/x(?=y)/。 解释:找一个x,那个x的后面有(yǒu)y。
先行否定断言(?!模式): x只有(yǒu)不在y前面才匹配,必须写成/x(?!y)/。 解释:找一个x,那个x的后面没有(yǒu)y。

稳住,又(yòu)来了两个断言,来自ES7提案:

后行断言(?<=模式):与”先行断言”相反, x只有(yǒu)在y后面才匹配,必须写成/(?<=y)x/。解释:找一个x,那个x的前面要有(yǒu)y。
后行否定断言(?<!模式): 与”先行否定断言“相反,x只有(yǒu)不在y后面才匹配,必须写成/(?<!y)x/。 解释:找一个x,那个x的前面没有(yǒu)y。

可(kě)以看出,后行断言先匹配/(?<=y)x/的x,然后再回到左边,匹配y的部分(fēn),即先右后左”的执行顺序。

零宽负向先行断言的例子:

JavaScript

var str=`<div class="o2">
<div class="o2_team">
<img src="img/logo.jpg" />
</div>
</div>`;
// <(?!img) 表示找一个左尖括号<,而且左尖括号<的后面没有(yǒu)img字符;
// (?:.|\r|\n)*? 表示匹配左右尖括号<>里面的.或\r或\n,而且匹配次数為(wèi)*?;(?:)不保存匹配项,提高性能(néng);
// *后面加个? 表示非贪婪匹配。
var reg = /<(?!img)(?:.|\r|\n)*?>/gi;
str.match(reg);
// 返回结果 ["<div class="o2">", "<div class="o2_team">", "</div>", "</div>"] 
反向引用(yòng):主要作(zuò)用(yòng)是给分(fēn)组加上标识符\n。
\n 表示引用(yòng)字符,与第n个子表达式次匹配的字符相匹配。
反向引用(yòng)的例子,给MikeMike字符后加个单引号:

JavaScript

var reg = /(Mike)(\1)(s)/;
var str = "MikeMikes";
console.log(str.replace(reg,"$1$2'$3"));
// 返回结果 MikeMike's
  
非打印字符

\s 任何空白字符。即[ \f\n\r\t\v]
\S 任何非空白字符。
\t Tab 字符(\u0009)。
\n 换行符(\u000A)
\v 垂直制表符(\u000B)。
\f 换页(yè)符(\u000C)
\r 回車(chē)符(\u000D)。

注意:\n和\r一起使用(yòng),即 /[\r\n]/g来匹配换行,因為(wèi)unix扩展的系统以\n标志(zhì)结尾,window以\r\n标志(zhì)结尾。

其他(tā)

\cx 匹配 x 指示的控制字符,要求x 的值必须在 A-Z 或 a-z 范围内。
\xn 匹配n,n 是一个十六进制转义码,两位数長(cháng)。
\un 匹配 n,其中(zhōng)n 是以四位十六进制数表示的 Unicode 字符。

\nm 或 \n 先尝试反向引用(yòng),不可(kě)则再尝试标识為(wèi)一个八进制转义码。
\nml 当n 是八进制数字 (0-3),m 和 l 是八进制数字 (0-7) 时,匹配八进制转义码 nml。

修饰符

i 执行不區(qū)分(fēn)大小(xiǎo)写的匹配。
g 执行一个全局匹配,简而言之,即找到所有(yǒu)的匹配,而不是在找到个之后就停止。
m 多(duō)行匹配模式,^匹配一行的开头和字符串的开头,$匹配行的结束和字符串的结束。
ES6新(xīn)增u和y修饰符:

u修饰符
含义為(wèi)“Unicode模式”,用(yòng)来正确处理(lǐ)大于\uFFFF的Unicode字符。也就是说,会正确处理(lǐ)四个字节的UTF-16编码。

JavaScript

// 加u修饰符以后,ES6就会识别\uD83D\uDC2A為(wèi)一个字符,返回false。
/^\uD83D/u.test('\uD83D\uDC2A') // false
/^\uD83D/.test('\uD83D\uDC2A') // true 
y修饰符
与g修饰符都是全局匹配,不同之处在于:lastIndex属性指定每次搜索的开始位置,g修饰符从这个位置开始向后搜索,直到发现匹配為(wèi)止;但是y修饰符要求必须在lastIndex指定的位置发现匹配,即y修饰符确保匹配必须从剩余的个位置开始,这也是“粘连”的涵义。

JavaScript

/b/y.exec('aba') // null
/b/.exec('aba') // ["b"] 
优先顺序:

\ 转义符
(), (?:), (?=), [] 括号和中(zhōng)括号
*、+、?、{n}、{n,}、{n,m} 限定符
任何元字符^、$、\ 定位点和序列
| 替换
关于引擎

JS 是 NFA 引擎。

NFA 引擎的特点:

以贪婪方式进行,尽可(kě)能(néng)匹配更多(duō)字符。
急于邀功请赏,所以左子正则式优先匹配成功,因此偶尔会错过佳匹配结果(多(duō)选条件分(fēn)支的情况)。
JavaScript

'nfa not'.match(/nfa|nfa not/)
// 返回["nfa"] 
回溯(backtracking),导致速度慢。
举个贪婪与回溯结合的例子:

JavaScript

"AB01CD23CD45CEff".match('AB.*CD')
// 返回 ["AB01CD23CD"] 

匹配顺序如图所示:

    深圳网站建设www.sz886.com

始终专注高端网站建设服務(wù) 网站建设案例服務(wù)方案联系

联系我们

135-3000-5572
151-1257-9390

地址:深圳市龙岗區(qū)横岗街(jiē)道联旺大厦5楼

邮箱:chenmh@sz886.com

我们的优势

12年建站服務(wù)经验自主开发后台CMS开发项目不外包无隐形收费

服務(wù)198家上市企业服務(wù)行业龙头超过70家 营销型网站建设完备的项目流程管理(lǐ)體(tǐ)系网页(yè)设计与网站开发技(jì )术并重

关于独占网络

十多(duō)年来,凭借对设计的深刻理(lǐ)解,对互联网营销趋势的敏锐洞察,独占网络不断修正服務(wù)导向,完善创作(zuò)品格,始终注重专业探索,為(wèi)所有(yǒu)合作(zuò)企业机构全力以赴,确保网站的视觉體(tǐ)验与营销转化能(néng)力。

我们是一群对互联网抱有(yǒu)执着信念的技(jì )术控。从2012年到现在,公(gōng)司从未建过强大的营销团队,却凭着作(zuò)品与服務(wù)不断保持增長(cháng),做到了"桃李不言,下自成蹊。" 我们坚信:每个客户都是一条渠道,每个案例都是一个广告,為(wèi)企业插上翅膀,助力企业转型升级,我们已做好准备。

专业团队為(wèi)您提供深圳网站建设、深圳网站制作(zuò)、深圳营销型网站建设、外贸网站建设等服務(wù),深圳建网站就找独占网络 | 12年专注网站建设

深圳市独占网络科(kē)技(jì )有(yǒu)限公(gōng)司 |备案号:京ICP证000000号| Copyright 2023,ALL Rights Reserved www.sz886.com | Copyright 2023版权所有(yǒu)
Hi,Are you ready? 如果您有(yǒu)意向
请于我们取得联系。

有(yǒu)一个互联网项目想和我们谈谈吗?
您可(kě)以填写右边的表格,让我们了解您的项目需求,这是一个良好的开始,我们将会尽快与你取得联系。当然也欢迎您给我们写信或是打電(diàn)话,让我们听到你的声音!

独占-整合互联网营销

地址:深圳市龙岗區(qū)横岗地铁D出口联旺大厦5楼
大客户专線(xiàn):深圳 13530005572
售前QQ:1447567909
E-mail: sales@sz886.cn

合作(zuò)意向表
您希望我们為(wèi)您提供什么服務(wù)?
《金瓶艳史》无删减在线观看 和漂亮老师做爰6 辣妹子影院电视剧免费播放视频 乖女从小被C到大H文NP 不戴奶罩的邻居HD中文 女人裸体让男人吃奶视频 教授和乖乖女H灌满阮阮 欧洲最强RAPPER免费高清 Xx性欧美肥妇精品久久久久久 男人添女人荫蒂视频观看 被黑人伦流澡到高潮HNP动漫 欧美亚洲精品SUV 糖心VLOG官网观看 女人脱了裤衩让男人捅 亚洲无人区码SUV 少女韩国免费观看高清电视剧 初尝滋味的少妇2 亚洲成色7777777久久 男人添女人下部高潮全视频 无敌高清在线观看免费 《肉体偿还》在线观看 人妻换人妻互换A片爽文 成全在线观看免费完整版电影 久久久久亚洲AV色欲AV 免费看欧美成人A片无码 无码国产精品一区二区色情男同 少女在线观看高清完整版免费动漫 男人边吻奶边挵进去A片小说 波多野结衣在线播放 国产日韩欧美 日韩无码专区 我和闺蜜在KTV被八人伦 火车上荫蒂添的好舒服 今天高清视频免费播放国语 免费看成人A片无码视频尤物 玉漱公主被肉干高H潮文不断 星辰视频在线观看免费观看 成人精品 高清WINDOWS免费版美国 每天都在主动求汆君臣 CHINESE男男GAY FUCK激情 无码精品人妻一区二区三刘亦菲 成全电影大全在线观看第二季 三年片免费观看国语电影 女人被添荫蒂舒服了A片看AK 被黑人伦流澡到高潮HNP动漫 么么哒影院电视剧在线观看 根管治疗多少钱一颗牙 糖心在线观看免费高清电视剧 被绑在坐桩机上抹春药BL推文 成全视频在线播放观看方法 黑白配高清国语免费观看 爽灬爽灬爽灬毛及A片 再深点灬舒服灬大了添JUWU 性生交大图片费看 少妇高潮呻吟A片免费看软件 大龟慢慢挺进张娟征的休 领导扒开我奶罩吸我奶头视频 花房姑娘免费大全好看 大肉大捧一进一出好爽MBA 交换娇妻1-36部分1 《年轻的护士1》在线观看视频 亚洲无专砖码直接进入 被三个室友狂躁到早上男男 少妇苏霞肉欲第501章 胸一面膜上边一面膜下边免费 夜夜穞天天穞狠狠穞AV美女按摩 三个人一起躁我吃奶头80分钟 最好看免费观看高清电影大全 含着她的花蒂啃到高潮在线观看 红楼梦87版全集免费观看完整版 无敌高清在线观看免费 凌晨三点看免费高清电视剧 丁香花高清在线观看完整 巜趁夫不在给给公侵犯了一天 校花被房东C得合不拢腿H男男 巜交换做爰2中字韩国 三个媳妇一锅烩全文免费阅读 老师的丰满大乳奶 俄罗斯艳片色情欲2