标签:js正则表达式 test exec match replace
在开始正则表达式之前,这里出个题给大家思考,看看大家都有哪些解决思路
问题:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
var str = "汉字a bc;";
好了,言归正传!我们开始js正则表达式
下面是js 中 正则表达式 应该掌握的基本知识简单罗列:
<1> i, m, g
<2> ^, $, \w, \d, \s, \b, .
<3> *, +, ?, {n}, {n,} ,{n,m}
<4> test, exac, match, search, replace, split
///////////////////////////////////////////////////
<1>
i: 不区分大小写
m: 多行匹配
g: 全局匹配
<2>
^: 首匹配
$: 尾匹配
\w: 字母、数字、下划线 匹配
\d: 数字 匹配
\s: 空白 匹配
\b: 单词首尾 匹配
.: 除换行符外任意字符
<3>
*: 匹配 前一字符 0个或多个
+: 匹配 前一字符 1个或多个
?: 匹配 前一字符 0个或1个
{n}: 匹配 前一字符 n次
{n,}: 匹配 前一字符 至少n次
{n,m}: 匹配 前一字符 n次到m次之间
<4>
test: reg.test(str); // 返回true/false
exec: reg.exec(str); // 以数组的形式返回第一个匹配的值
match: str.match(reg); // 返回数组
search: str.search(reg); // 返回number
replace: str.replace(reg); // 返回字符串
split: str.split(reg); // 返回数组
为了方便理解,这里先讲解各种匹配模式,然后再讲6种方法
1.简单模式(只通过普通字符的组合来进行匹配)
var reg = /ab0c/;
2.符号^
匹配字符串的起始端
3.符号$
匹配字符串的末尾端
4.符号*
匹配前一个字符0次或多次
5.符号+
匹配前一个字符1次或多次
6.符号?
?的用法比较特殊,一般来说它用来对前一个字符做0次或1次匹配,
但是它有另外两种特殊的用法:
如果紧跟在*、+、?和{ }之后,则表示原始匹配的最小次数匹配
7.符号.
匹配任何一个单独的字符,但是换行符除外
8.符号(x) x指代一个字符串 匹配x,会记住x
var regx=/a(b)c/; var rs=regx.exec("abcddabcd"); console.log(rs);从上面可以看出,/a(b)c/匹配“abcddabcd”中的“abc”,因为()的原因,b也会记录下来,
var regx=/a(b)c/; var rs=regx.exec("abcddabcd"); console.log(rs);从上面可以看出,/a(b)c/匹配“abcddabcd”中的“abc”,因为(?:)的原因,b不会被记录下来,
var regx=/user(?=name)/; var rs=regx.exec("The username is Mary");结果:匹配成功,而且rs的值为{user}
var regx=/user(?!name)/; var rs=regx.exec("The user name is Mary");结果:匹配成功,而且rs的值为{user}
var regx=/beijing|shanghai/; var rs=regx.exec("I love beijing and shanghai");结果:匹配成功,rs的值为{beijing},虽然shanghai也匹配,但不会被记住。
var regx = /user\d/; var rs = regx.exec("user145"); console.log(rs);结果:匹配成功,rs的值为:["user1", index: 0, input: "user145"]
var regx = /user[0-9]+/; var rs = regx.exec("user145"); console.log(rs);结果:匹配成功,rs的值为:["user145", index: 0, input: "user145"]
<1> test() 方法:
reg.test(str); // 返回true/false
var str = "12abc678abc2hh"; var reg = /abc/; console.log(reg.test(str)); //true reg = /rgy/; console.log(reg.test(str)); //false////
var str = "12abc678abc2hh"; var reg = /abc/; console.log(reg.exec(str)); // ["abc", index: 2, input: "12abc678abc2hh"]
var str = "12abc678abc2hh"; var reg = /abc/; console.log(str.match(reg));// ["abc", index: 2, input: "12abc678abc2hh"] var reg = /abc/g;// 全局匹配 console.log(str.);// ["abc", "abc"]
var str = "12abc678abc2hh"; var reg = /abc/; console.log(str.search(reg)); // 2 var reg = /abc/g; console.log(str.search(reg)); // 2可见 search()只会匹配第一个,并返回其index
var str = "12abc678abc2hh"; var reg = /abc/g; console.log(str.replace(reg, "ABC"));// 12ABC678ABC2hh console.log(str.replace(/(\d+)([a-z]+)/g, "$2[$1]"));// abc[12]abc[678]hh[2]后一种属于比较高级的用法,需要好好体会。
var str = "12abc678abc2hh"; console.log(str.split(/[a-z]+/));// ["12", "678", "2", ""]这里演示了以字符串为间隔形成数组的过程,也体现了正则表达式的强大之处
/////////////////////////////////////////////////////////////////////////
好了,想必大家对一开始提出的问题也有了自己的想法了吧,这里给出用正则表达式解决的方法
String.prototype.len = function(){ return this.replace(/[^\x00-\xff]/g, "aa").length; } var str = "汉字a bc;"; console.log(str.len());// 9
标签:js正则表达式 test exec match replace
原文地址:http://blog.csdn.net/u011700203/article/details/45562345