您的位置:首页 > 其它

正则表达式学习笔记

2015-06-15 16:55 204 查看
以下实例为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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: