JS正则表达式的RegExp对象和括号的使用等需要注意的

但在要求参数变化的环境下,RegExp()构造函数是更好的选择:var
【菜科解读】
RegExp对象的创建:
常规的正则表达式的创建可用直接量,即斜杠 “/” 括起来的字符。
但在要求参数变化的环境下,RegExp()构造函数是更好的选择:
var reg1 = /'\w+'/g;var reg2 = new RegExp('\'\\w+\'','g');对比两种创建方式,RegExp中的第一个参数为要创建的正则字符串,一方面注意,因为不是直接量的表示形式,因此不用斜杠“ / ”括起来了;而是字符串中必须要对引号“ ‘ ”和转义符号“ \ ”进行二次转义。
此外,无论是直接量还是RegExp()构造函数,都是生成了新的RegExp对象,并将其赋值给变量。
在《Javascript权威指南》一书中讲到,对于正则表达式的直接量,ECMAscript 3规定在每次它时都会返回同一个RegExp对象,因此用直接量创建的正则表达式的会共享一个实例。
直到ECMAScript 5才规定每次返回不同的实例。
各浏览器中,IE一直遵守ECMAScript 5中的规定,其他浏览器的较老版本则遵循ECMAScript 3的规定。
因此在实际应用中,采取构造函数创建的方法比较安全,或者在使用lastIndex属性时要记得归0。
括号()的使用:
1、分组
即把单独项组合成子表达式统一处理,一般用于?、+、*、{n,m}等的重复处理。
见例子:
var reg = /Java(script)?/;式子里将script进行统一处理。
2、向后引用
即在正则表达式中用“\n”(n代表引用的序号)引用式中前面括号中匹配的文本。
见例子:
var reg = /(\d+)[a-z]{3}\1/; //20man20//20man23 错//reg = /\1[a-z]{3}(\d+)/; 错注意 “\n”引用的是前面匹配的文本" 20 ",而不是匹配的正则表达式" \d+ "。
另外,JS里只能引用前面的匹配文本,像例子中的将 \1写在括号引用的前面,将不会匹配到任何文本,浏览器中会提示出错。
同样,JS里也不支持类似“ (?exp) ”(exp为正则字符)的引用命名规则,只支持数字的引用。
既然提到了分组和引用,如果只想进行分组,而不想引用,则可用 "(?: exp)"的形式,既不匹配文本,也不给引用编号。
见例子:
var reg = /(\w{3})(?:\d+)([a-z]{2})\2/;//man7788abab显然 \2 匹配的是 "ab" 而不是 "7788" 。
这样便于分组处理,也加快了查询的效率。
3、子模式匹配
有时我们想直接引用操作括号匹配的本文,那么可以用子模式匹配的功能(权威指南里叫子模式匹配,有点别扭,实际就是用一个变量形式替换匹配的文本)。
基本形式是用 ’$n’的形式替代匹配编号为n的文本,常用在String对象里的replace()方法,见例子,等号两边交换单词:
var reg = /(\w+)=(\w+)/;var str = ‘love=hate’;str.replace(reg,'$2=$1');//"hate=love"次序、贪婪、懒惰:
一般的重复匹配字符如?、+、*、{n,m}在匹配的过程中,采用贪婪匹配的方法,即尽可能多的匹配到结果字符。
与之对应的是懒惰匹配,即尽可能少的匹配结果,使用形式只需在重复匹配字符后加上问号" ? "即可,如??、+?、*?、{n,m}?。
见例子:
var str = 'goooogle‘;var reg1 = /o+/; //"goooo"var reg2 = /o+?/; //"go"现在对例子稍加改动:
var str = 'goooogle‘;var reg1 = /o+gle/; //"oooogle"var reg2 = /o+?gle/; //"oooogle"改过后的例子结果变为相同了,为什么 /o+?gle/ 没有匹配到“ogle”呢?原来正则表达式中总是从左往右进行匹配的,不会从右边获取子串进行匹配。
虽然上面的结果相同,但匹配的原理不太一样。
在reg1中,首先o+会匹配所有的"o",然后接着匹配"gle",从而完成整体匹配。
而在reg2中,o+?会先匹配一个"o",然后gle在字符串的第2位到第4位(即原串的"ooo")匹配失败。
进而回溯至o+?去匹配第二个"o",成功后再在第3位到第4位匹配"gle",以此类推……最后匹配到整个字符串。
总体要记住,从优先级来说,从左往右的次序匹配 > 贪婪 / 懒惰匹配。
零宽断言:
关于零宽断言的总体解释可参考博文《正则表达式30分钟入门教程》,值得注意的是,JS里只支持零宽先行断言。
即零宽正预测先行断言"(?=exp)"和零宽负预测先行断言“(?!exp)"。
所谓“零宽”,就是它并不在匹配的结果字符中占据空间。
例如“\w","\s"就会占据一个或几个空间,依匹配的字符长度决定。
而像”^","$"这种对应的首末位置,不占据空间,零宽就是属于这一类。
所谓“正 / 负预测”,是指断言中要求满足的情况。
“正”表示要满足exp,“负”表示要不满足exp的。
所谓"先行",是指被匹配的字符串在前面,零宽断言跟在后面。
即串的后一部分是否满足断言。
所谓“断言”,就是判断的条件。
看两种零宽断言的例子:
var str = 'java coffeescript';var reg1 = /\b\w+(?=script\b)/; //coffee var reg2 = /\b\w+(?!script\b)/; //javareg1为零宽正预测先行断言,"(?=script\b)"表示某单词需以“script”结尾,它代表着一种条件,不占有任何空间大小。
同样,reg2为零宽负预测先行断言,"(?!script\b)"表示不以“script”结尾的单词。
另外,因为没有零宽后顾断言,不能判断某字符串的前面部分满足什么条件。
但在JS中可以用多次正则表达式来实现:先匹配到要找的串,然后截取开头到index的字符子串,再匹配子串末尾是否符合需要的断言条件。
具体用法可另外尝试一下。
match()与exec()的异同:
match和exec是正则表达式匹配字符串的常用方法。
两者实现的功能差不多,有些细微的区别:
1、使用方式
match是字符串包装对象的方法,用法:String.match(RegExp);
exec是正则表达式对象的方法,用法:RegExp.exec(String);
2、返回的结果
当RegExp没有设置全局标志 "g" 时:
两者的返回结果相同。
即无匹配值时返回null,有匹配值时返回一个数组(令array)。
array[0]为匹配的字符串,array[1]、array[2]……则对应为正则表达式中圆括号匹配的子字符串$1、$2……。
同时数组带有两个属性,array.index表示匹配字符串的初始位置,array.input表示正在检索的字符串。
当RegExp有设置全局标志 "g" 时:
match在有值时返回一个数组array。
数组的每项依次表示匹配到的所有的字符串,因此不再有圆括号匹配的子字符串了。
此时数组没有index属性和input属性。
exec则与没有全局标示 "g" 的表现无异。
此时返回的是数组array,array[0]为当前匹配的字符串,array[1],array[2]……则为当前匹配下的圆括号匹配的字串。
此时要注意RegExp对象的lastIndex属性,表示原字符串中匹配的字符串末尾的后一个位置。
当没有进一步的匹配结果时,lastIndex属性置0。
因此,可用lastIndex的循环找出所有的匹配字符串。
来看看例子:
varstr = 'I love1 my job22';
var reg = /\b[a-z]+(\d+)\b/g;array = str.match(reg);//array = ["love1", "job22"] //array.index = undefind//array.input = undefined------------------------------------array = reg.exec(str);//array = ["love1", "1"]//array.index = 2//array.input = "I love1 my job22"//reg.lastIndex = 7//run againreg.exec(str);//array = ["job22", "22"]//array.index = 11//array.input = "I love1 my job22"//reg.lastIndex = 16//run againreg.exec(str);//reg.lastIndex = 0最后,考虑到ECMAScript 3 和ECMAScript 5的版本区别,每次匹配完之后记得要手动将RegExp对象的lastIndex属性置0,以满足老非IE浏览器的要求。
正则,表达式,的,RegExp,对象,和,括,号的,使用,清朝皇家最悲惨的嫡子是哪位?此人生前没有任何封爵
一年后,康熙将胤礽立为皇太子,这意味着的皇位继承制度发生了变化,受到了大清的推崇,所以嫡子的地位空前提高。
然而,在清朝历史上却有一位命运非常悲惨的嫡子,他就是第十二子。
其实,永璂能够成为嫡子有一定的运气成分。
大家都知道乾隆的嫡妻是孝贤皇后,富察氏自嫁给乾隆帝以来便备受宠爱,先后生下了四个子女,其中包括两位嫡子二阿哥永琏和七阿哥永琮。
然而,令人的是,这两位身份尊贵的皇子却担不起这份福气,早早地便离开了人世,即便他们都曾是父皇乾隆心中皇位继承人的不二之选。
两位皇子的夭折令孝贤皇后身心俱疲,于乾隆十三年三月病逝于东巡途中。
孝贤皇后去世后,娴贵妃那拉氏幸运地被崇庆皇看中,继立中宫,成为大清国的皇后。
就在那拉氏继立为皇后第三年(乾隆十七年)的四月份,她便在翊坤宫生下了一位小皇子,即十二阿哥永璂。
由于是中宫皇后所生,永璂自然便贴上了嫡子的标签,这使得那拉氏的地位更加稳固,而且,永璂也很有可能成为皇储的最佳人选。
然而,天有不测风云,人有旦夕祸福。
乾隆三十年年初,乾隆帝开始了第四次江南之行,在途中发生了著名的继后剪发事件,从此那拉氏母子彻底失宠。
一年后,那拉氏便凄惨地死于冷宫,冷酷的乾隆帝甚至没将那拉氏葬入自己的地宫,而是将其塞到了的地宫,位居侧位,相当于给一名妾室给陪葬了。
自从那拉氏病逝后,十二阿哥永璂彻底失去了依靠,此后,他再也没能得到父皇乾隆的关怀,就连其他的兄弟也不再亲近他,永璂十分落寞,却又无可奈何。
乾隆四十一年正月,在孤寂和抑郁中度过十年之久的永璂病逝,年仅24岁。
从此,他那位年轻的嫡福晋博尔济吉特氏便成了一名寡妇。
令人意想不到的是,永璂生前没有任何封爵,而且死后还是按照宗室公例治丧的,堪称大清最悲惨的嫡子了。
不知在永璂临终前心中会作何感想,会不会对母亲的惊人之举抱有悔恨,不过这都不重要了,因为一切都再也回不去了。
随机文章宋朝开国将领中有人姓黄吗?明朝的戚继光在哪一个皇帝的朝廷任职?汉武帝刘彻是纯种的汉人吗?陕西淳化7.20盗墓案大起底,涉案文物达1100件(10盗墓团伙被抓)黑洞里面是另一个宇宙,宇宙中每个黑洞都是平行宇宙
风流皇帝乾隆后宫的祥答应是何许人物?为什么死后没有入皇陵
然而,根据史料记载,其实乾隆后宫中还有一位答应,不知葬于何处,她就是祥答应。
祥答应是乾隆后宫中唯一的答应。
清朝后妃的来源主要有两种: 第一种是八旗选秀,秀女主要来自家世良好的八旗世家,她们被选中后便可以直接册封为妃嫔,起点一般是贵人。
第二种是宫女选秀,秀女主要是来自三旗的包衣女子,被选中后大多数会充任宫女,或是以使女(官女子)的身份入侍某位皇子,只有极少数幸运者会被皇帝看中,不过这些幸运儿也会被分派到某位上层后妃寝宫中学习规矩,也就是做宫女。
从历史记载来看,祥答应入宫的时间是乾隆十八年七月十五日,最初的名分是祥贵人。
能够一入宫便封为贵人,这说明祥答应并不是出身内务府的包衣女子,而是来自外八旗的秀女,因此,祥答应的家世应该是很不错的。
然而,或许是在家中过于娇惯的缘故,初入宫闱的祥贵人对宫廷礼仪不太熟悉,一不小心就触犯了龙颜,不久就被乾隆帝降为祥常在。
这次,祥常在终于见识到了天子的权威,从此以后谦恭谨慎,小心翼翼地侍奉帝王,并学习宫中礼仪规矩。
乾隆二十四年,祥常在被复封为祥贵人,终于回到了原来的位置。
不过,当时乾隆后宫中最得宠的却是令妃,魏氏这一年由于小产被晋封为令贵妃,成为乾隆后宫第三主位,次于皇后那拉氏和纯贵妃。
然而,祥贵人似乎也想在后宫中分一杯羹,不过,雨露均沾在她看来似乎是一个遥不可及的梦想,最终她再次惹怒了天子,这一次,暴风雨来得似乎更加猛烈,祥贵人被连降两级,竟降到了祥答应。
答应是清朝后妃等级中最低的一级,能够降到这个位分,实际上跟打入冷宫没有什么区别了。
一般来讲,祥答应很难有的机会了,她不但每天面对着宫女与的,还要在极度贫乏的物质生活上备受煎熬,甚至是吃不饱穿不暖。
祥答应怎么也不会想到,自己当初入宫可是怀着要做宠妃的梦想,没想到自己会到这步田地,真是造化弄人呀! 乾隆三十八年三月二十八日,祥答应病逝于宫中,年龄应该在30岁到40岁之间。
令人的是,乾隆帝仍然余怒未消,拒绝将祥答应葬入自己的皇陵,至于究竟将其葬到了哪里,史料中也没有记载,估计应该是随便葬到像曹八里屯宫女葬地那样的场所吧。
随机文章北极圈里的富兰克林木乃伊,因铅中毒而死在探索航道的路上恐惧魔王迪亚波罗,勾引王子占据身体和灵魂(天堂最大敌人)武则天的最后归宿乾陵地宫,乾陵地宫为什么不发掘(盗墓贼连连碰壁)世界上最毒的鸟,冠林鵙鹟/羽毛杀人如无形宙斯为何忌惮哈迪斯,聪明的宙斯维持长久统治的套路