正则表达式学习笔记

以下实例为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,Pablo\nGauin,Paul\nVan Gogh,vincent";
names.replace(/([\w ]+),([\w ]+)/g,"$2 $1");
——>"Pablo Picasso\nPaul Gauin\nvincent 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 = “123\r\n456″;
var reg1 = new RegExp(“^123$\r\n^456$”,“m”); // true
var reg2 = new RegExp(“^123$\r\n^456$”,“”); // false
var reg3 = new RegExp(“123\r\n456″,“m”); // true
var reg4 = new RegExp(“123\r\n456″,“”); // true
alert(reg1.test(str) + “\r\n” + reg2.test(str) + “\r\n” + reg3.test(str) + “\r\n” + reg4.test(str));




参考 1、《Java Script编程精解》 (美)Marijn Haverbeke著 徐涛 译 2、http://www.smalluv.com/regex_parameter_g_i_m.html

相关文章

正则替换html代码中img标签的src值在开发富文本信息在移动端...
正则表达式
AWK是一种处理文本文件的语言,是一个强大的文件分析工具。它...
正则表达式是特殊的字符序列,利用事先定义好的特定字符以及...
Python界一名小学生,热心分享编程学习。
收集整理每周优质开发者内容,包括、、等方面。每周五定期发...