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,对象,和,括,号的,使用,中国历史上唯一的太监王朝,要想当官必须先净身
不过,历朝历代都有例外,宦官把持朝政的事件也并不少见。
但是你能想象,整个王朝里的官员都是一些被净过身的“太监”吗? 五代十国里的南汉政权可谓是我国封建社会中最最奇葩的一个王朝了。
南汉,辖境47州,位于现今天广东、广西两省,及越南北部,面积约40多万平方公里。
刘䶮于917年在番禺称帝,国号“大越”,次年改国号为汉,史称南汉。
虽然刘䶮建立了南汉,但是他的继任者们各个骄奢淫逸,,这也是为什么南汉在五十多年的时间里,更换了四个皇帝的重要原因。
但这还不算什么新鲜事,毕竟暴君在很多个朝代都会偶尔碰上那么一两个。
要说南汉王朝最奇葩的事情就是在南汉的官制里有一项非常特殊,且多少有些令人难以齿的规定:但凡每一个在上取得重要名次的录取者,如果你想要进入官场,那么首要条件就是要先净身,“登龙门”便意味着“进阉门”。
大到宰相尚书,小到县令捕快,只要你成为南汉王朝里一名领取俸禄的官员,那你就必须要先阉割,变成太监,无一可以幸免。
所以,现在很多史学家们也将南汉王朝称为中国历史上唯一的一个太监王朝。
按道理来说,只有经常在宫里走动,频繁接触嫔妃的男人才有净身的必要。
将百官阉割成太监又是因为什么呢? 因为在南汉皇帝看来,如果官员们有家有室,有妻儿老小,那么自然不可能将全部精力都放在对皇帝尽忠上,所以干脆就将官员全部阉割掉。
到南汉最有一位皇帝刘怅继位时,更是荒诞到了极点,16岁的刘怅全盘接受了先辈们的残暴、骄奢、淫逸的传统,把个秀丽的岭南变成了一个地地道道的人间地狱。
开宝三年(970年)宋太祖先礼后兵,劝降刘怅,南汉主狗眼看人低,不仅不降,反将宋使龚慎仪囚禁,宋太祖恼羞成怒,兴兵南伐。
南无悍将,只好派阉人李托统兵,两军交锋,大宋军如,将南汉大军如砍瓜切菜一般,杀了个屁滚尿流,将南汉宗室文武上至汉主刘怅,下至群臣悉数擒拿,押住汴都。
后汉主刘怅文治武功,一无所长,却有一张善辩的巧嘴,当宋太祖当面宣渝责问他时,刘怅此时反倒不慌不忙,向前叩首道:“臣年十六僭位,龚澄枢、李托等,俱先考旧人,每事统由他作主,臣不得自专。
所以臣在国时,澄枢等是国主,臣实似臣子一般,还乞皇上明察。
” 好一副恬不知耻的嘴脸!荒淫无道的君王,国破家亡,尚不知自责,竟然把所有的责任一股脸全部推给了臣子,自己倒落了个干干净净!善玩权术的宋太祖,竟然依了刘怅的辩解,将龚澄枢、李托等南汉权臣推出午门斩首,却特诏赦了刘怅,还授予他检校太保右大将军,封恩赦候。
一个荒诞的王朝,就这样覆灭了,一个万恶不赦的末代皇帝却意外地被授官封侯,安享天年。
南汉王朝的毁灭,在天理之中,就象一个烂透的果子,非掉下地来不可,使人不可思议的是如此腐败的王朝竟然延续了五十五年之久。
象刘怅这样无德、无仁、无能的君主,竟然还会有人为之效力,危难当头,君王只顾自己活命,却反咬一口,将臣子送上断头台,做如此昏君的垫脚石,又有什么价值。
随机文章昆式战斗机存在吗,专家认为数百年人类才有技术制造揭秘印度2018登月计划,阿三开挂仅靠960万美元登月(牛飞了)巡航导弹的制导过程分析,惯性/GPS/地形匹配混合制导五大外星灵魂的特征,不恐高/不喜欢汽车与竞争/能与海豚产生感应太阳系为什么绕银河系原因,地球围着太阳转/太阳围着银河系转
真实的纳粹集中营是什么样的 里面的人又会是如何死的
位于爱沙尼亚的克鲁加集中营设立于1943年,关押了包括苏军俘虏、爱沙尼亚政治家以及许多犹太人。
在纳粹党卫军和爱沙尼亚警察的残暴管制下,许多囚徒被强迫进行各种重体力劳动,由于生存条件极其残酷,许多人在集中营中死去。
萨克森豪森集中营于1936年8月建成,是纳粹党卫队头目希姆莱被希特勒任命为警察头子后建立的第一个集中营。
它的建造者是德国西部埃姆斯兰地区集中营的囚犯。
萨克森豪森集中营占地400公顷,整个布局是个正三角形。
囚犯居住的木制营房呈扇形分布其间。
据称,该集中营完全是按照希姆莱的要求设计建造的,他要将萨克森豪森集中营建成一座“现代化”和“完美”的集中营,为以后在德国及欧洲各地继续建造集中营树立最为“理想”的模式。
作为的“示范”集中营,萨克森豪森集中营在纳粹体制中占有非常重要的地位。
1945年4月,在萨克森豪森集中营解放后,在火葬场发现大约8桶560公斤重的头发”。
纳粹分子用死难者的头发织布,这一令人作呕的罪行在许多集中营都被发现过。
据悉,当年苏联红军在解放奥斯维辛集中营时就发现了7吨多的头发,那是纳粹分子从火葬前的尸体上剪下来的。
他们用犯人的头发织成布,给裁缝当衣服的衬料用。
在集中营里,囚犯哪怕是触动了最细微的一条规定,也会遭到党卫队的毒打。
而在集中营恶劣的卫生条件下,这种毒打的后果往往是致命的。
而位于奥地利 Ebensee 集中营,1945 年5月7日被美国第80师解放。
集中营内的犹太人不是因苦役而死,就是被送进毒气室用毒气熏死。
毒气室的外表看起来像个浴室,上面装有像洗澡用的莲蓬头。
囚犯们脱衣后由更衣室进入“浴室”,管理人员立即关闭房门,通过管道从莲蓬头将毒气放入, 集中营官员表示,他曾亲眼目睹五百名俄罗斯人赤裸地步入毒气室。
由于毒气室内过分挤迫,以致被毒死的人死后姿势仍是僵硬地“站”。
英国公众档案处曾公开有关二次大战时期纳粹德国大屠杀暴行的机密档案,披露了当时在纳粹集中营内用活人作医学试验品,以及犹太人被迫吃人肉充饥的各种恐怖事件,令人毛骨悚然 随机文章没结婚的人不能抬棺材,抬棺材容易倒霉(亲人也不能抬)普遍存在的羊群效应,随大流可能导致你在错误的道路上越走越远中国鹰击18反舰导弹,射程和突防能力位列世界前三石头鱼有毒为什么能吃,让人致命的毒在哪里/怎么祛除盘点二战十大废柴武器,600毫米的卡尔臼炮摧毁一栋楼(重达124吨)