正则表达式学习笔记
发布时间:2020-12-13 22:26:27 所属栏目:百科 来源:网络整理
导读:以下实例为JS代码 ★ 就像字符串以引号"开始,以”结束,正则表达式以斜杠/开始,以/结束; ★ 正则表达式在关系斜杠后,可以添加可选项,i表示不区分大小写,g表示全局; ★ [ ] 它包含一个字符列表,只要其中一个字符被找到即可被匹配上; ★ 反转模式: 正
以下实例为JS代码
★ 就像字符串以引号"开始,以”结束,正则表达式以斜杠/开始,以/结束; ★ 正则表达式在关系斜杠后,可以添加可选项,i表示不区分大小写,g表示全局; ★ [ ] 它包含一个字符列表,只要其中一个字符被找到即可被匹配上; ★ 反转模式: 正则表达式关键字区分大小写,正常小写,大写时与小写意义正好相反。比如:d表示“任意数字”,D表示“任意不是数字的东西“; 使用中括号[]时,反转模式可以用^字符开始: var notABC = /[^ABC]/; "ABCBACCBBADABC".search(notABC); ——>10 ★ 大多数标点字条在正则表达式中有特殊含义 .(点) “任何不是换行符的字符” ★ +母字在正则表达式中也有特殊含义 d 任何数字 w 任何单词(也就是任何英文、数字、下划线构成的字符) s 任何空字符(例如Tab、换行、空格) b 单词边界(它可以是标点符号、空格、字符 的开头或结尾) ★ ^$成对出现,用来限制字符串开始结束 有时需要确认一个模式以特定字符开始、或以特定字符结束,可以使用关键字^和$来完成,^匹配字符的开头,而$匹配字符的结尾: /a/.test("blah");//——>true(匹配任何包含字符a的字符串) /^a$/.test("blah");//——>false(只能匹配字符串"a") ★ 重复模式: 在元素后面跟一个*表示可以重复匹配任意次数(包括0次);元素后面跟一个+表示至少要匹配一次;元素后面跟一个?表示该元素可选(0次或1次)。 在必要的时候,可以使用花括号来指定一个元素可能发生的次数,花括号里只有一个数字(例如{4})确定了元素必须出现的次数;花括号之间有两个数字时,表示元素至少要出现第一个数字的次数,而且最多只能出现第二个数字的次数,类似地{2,}表示出现2次或2次以上,{,4}表示出现次数要少于等于4次。 ★ 子表达式分组: 通常需要在同一个表达式里,对多个字符使用像*或+这样的特殊字符,可以使用小括号对表达式的一部分进行分组,然后用整个分组进行匹配,例如: var cartoonCrying = /boo(hoo+)+/i; cartoonCrying.test("boohooooohoohoooo"); ——>true ★ 对于更高级的“分支”模式,可以使用竖线|表示允许模式在多个元素中选一个,示例如下: var holyCow = /b(sacred|holy) (cow|bovine|bull|taurus)b/i; holyCow.test("Sacred bovine!"); ——true ★★★ JS中与正则表达式相关的4个方法: 字符串有4个方法可以用到正则表达式: 1、正则表式.test(字符串); //检测字符串是否匹配正则表达式 2、字符串.search(正则表达式); //正则表达式第一次匹配的索引,-1表示字符串根本不匹配, 3、字符串.match(正则表达式); //返回匹配的字符串组成的数组,匹配失败返回null,注意/正则表达式/g的影响 4、字符串.replace(正则表达式,字符串或方法); //注意/正则表达式/g的影响 ★ 字符串.match(正则表达式) "No".match(/yes/i); ——>null "...yes".match(/yes/i); ——>["yes"] "Giant Ape".match(/gaint (w+)/i); ——>["Giant Ape","Ape"]; 返回数组的第1个元素是匹配整个模式的字符串,当模式里有小括号时,括号匹配的部分将添加到该数组的第2个元素,第3个元素…… ★ 字符串.replace(正则表达式,字符串或方法) 1、最简单的方式: "Borobudur".replace(/[out]/g,"a"); ——>"Barabadar" 2、有时候我们需要保留替换掉的部分。例如,交换的人姓和名 var name = "小明 李"; name.replace(/(.*) (.*)/,"$2 $1"); ——>"李 小明" $1和$2代表模式里括号部分,$1表示第一对括号的内容,$2表示第二对括号的内容,以此类推,一直到$9(AS中一直到$99)…… 再举一个例子:如果一个大字符串中包含很多人名,每行有一个人名,格式是:名,姓。如果我们想把中间的逗号去掉,并进行名和姓的换位,来得到简单的姓名格式,可以使用如下代码: var names = "Picasso,PablonGauin,PaulnVan Gogh,Vincent"; names.replace(/([w ]+),([w ]+)/g,"$2 $1"); ——>"Pablo PicassonPaul GauinnVincent Van Gogh" 3、如果模式里的括号超过9个,这一技术将不再适用,只能使用另外一个更灵活的方式。 当传给replace函数的第2个参数是函数而不是字符串时,每次找到匹配值,该函数就会调用一次,匹配的文本就会被函数的返回值给替换掉。传递给函数的参数是成功匹配的元素,它们与match返回的数组里值类似:第一个参数是整体匹配,后面是每个括号匹配的部分。 下面是一个简单的示例: "the cia and fbi".replace(/b(fbi|cia)b/g,function(str){ return str.toUpperCase(); }) ——>"the CIA and FBI"; 还有一个更好的示例: var stock = "1 lemon,2 cabbages,and 101 eggs"; function minusOne(match,amount,unit){ amount = Number(amount) - 1; if(amount>1) { return amount + " " + unit; } else if(amount==1) { unit = unit.slice(0,unit.length-1); return amount + " " + unit; } else { return "no " + unit; } } var str1 = stock.replace(/(d+) (w+)/g,minusOne); console.log(str1); ——>"no lemon,1 cabbage,and 100 eggs" 它接收一个字符串,找出所有出现的数字接字母数字单词,以字符串的形式将每次出现的数字递减返回。 (d+)分组表示函数里的amount,(w+)分组表示匹配的unit,函数将amount转化成数字(因为它匹配了d+,所以一直都有效),如果只剩下一个或零个的再做一些调整。 ★★★正则表达式中参数g、i、m的作用 ★ 参数 g g 只影响于 exec、match 方法。 若不指定 g,则:每次调用 exec 都只返回第一个匹配;match 也是只返回第一个匹配。 若指定 g,则:每次调用 exec 都从上一个匹配之后查找新的匹配;match 则是返回所有的匹配。 还有一种情况,就是使用 string 对象的 replace 方法时,指定 g 表示替换所有。 var str = “1a1b1c”; alert(str.replace(/1/,“”)); // a1b1c alert(str.replace(/1/g,“”)); // abc ★ 参数 i 参数 i 是指忽略大小写,注意仅是忽略大小写,并不忽略全半角。 ★ 参数 m m 影响对行首、行尾的解释,也就是影响 ^、$。 若不指定 m,则:^ 只在字符串的最开头,$ 只在字符串的最结尾。 若指定 m,则:^ 在字符串每一行的开头,$ 在字符串第一行的结尾。 var str = “123rn456″; var reg1 = new RegExp(“^123$rn^456$”,“m”); // true var reg2 = new RegExp(“^123$rn^456$”,“”); // false var reg3 = new RegExp(“123rn456″,“m”); // true var reg4 = new RegExp(“123rn456″,“”); // true alert(reg1.test(str) + “rn” + reg2.test(str) + “rn” + reg3.test(str) + “rn” + reg4.test(str));
参考 1、《Java Script编程精解》 (美)Marijn Haverbeke著 徐涛 译 2、http://www.smalluv.com/regex_parameter_g_i_m.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |