本教程仅供小白学习正则表达式入门使用~
正则表达式是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。—— 百度百科
它的功能很强大,可以检索,替换文本。比如javascript里面经常会使用正则表达式来做表单验证(判断手机号码,邮箱格式等)。
想要快速入门,那你先花点时间把下面这些常用的标志符(元字符)或操作记下来。
.
- 匹配除了换行符之外的任意字符 *
- 指定前边的内容可以连续重复使用任意次 +
- 指定前边的内容可以连续重复一次或多次 ?
- 指定前边的内容可以连续重复一次或0次 {n}
- 指定前边的内容可以连续重复n次 {n,}
- 指定前边的内容可以连续重复n次或更多 {n,m}
- 指定前边的内容可以连续重复n到m次 /d
- 匹配一个数字 /w
- 匹配字母或数字或下划线或汉字 /s
- 匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等 [XYZ]
- 匹配中括号里面的任何一个字符 [XYZ]+
- 匹配中括号中的一个或多个字符 $
- 匹配字符串的结尾 ^
- 匹配字符串的开头 [a-z]
- 匹配任意小写字母 [^a-z]
- 在中括号里面的^表示否,这个例子中任何非小写字母的字符都能匹配 i
不区分大小写搜索 m
多行搜索 g
全局搜索 虽然看上去很无聊,但是如果你能10分钟背下来,你肯定会更无聊。
安利一个正则表达式 在线工具 (爱用不用~)
它可以在线测试,排错,帮你分析每个字符的意义。
Test()
这个方法接受一个字符串参数,并且返回一个bool值标示目标字符串是否匹配成功。
var username = 'JohnSmith';
alert(/[A-Za-z_-]+/.test(username)); // returns true
检测你背诵能力的时候到了~
上面的例子中,我们创建了一个正则表达式, /[A-Za-z_-]+/
这部分,它可以用来检测目标字符串是否满足全部由大小写字母以及下划线,减号组成。通常在验证注册表单的时候会用到。 [A-Za-z_-]
匹配一个 []
中的字符, +
号指定前边的内容可以连续重复一次或多次。你肯定一眼就看出来了!
Split()
程序员对split这个方法肯定也很熟悉了,它用于把一个字符串分割成字符串数组。
但是你可能不知道,它除了接受分割符参数以外,还接受正则表达式。
var str = 'this is my string';
alert(str.split(//s/));
// alerts "this, is, my, string";
/s
匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等,于是就讲str分割成数组[this, is, my, string]
var str = 'this is my this string';
alert(str.split(//s/)[3]); // alerts "string"
Replace()
replace方法用于将匹配的内容替换成目标内容。
比如我们想把 Hello,World
的World替换成Universe,我们可以这么干。
var someString = 'Hello, World';
someString = someString.replace(/World/, 'Universe');
alert(someString); // alerts "Hello, Universe"
再举个栗子,比如我们需要把用户输入的特殊符号删除。
var username = 'J;ohnSmith;@%';
username = username.replace(/[^A-Za-z/d_-]+/, '');
alert(username); // JohnSmith;@%
我们把除了大小写字母以及下划线,减号之外的字符全都替换成 ''
。注意 []
里面的 ^
表示取反。
注意上面的栗子,我们只替换了第一个字符,因为默认一匹配就不再继续搜索。我们可以直接在正则后面添加 g
开启全局模式。
var username = 'J;ohnSmith;@%';
username = username.replace(/[^A-Za-z/d_-]+/g, '');
alert(username); // alerts JohnSmith
Match()
跟test不太一样,match的调用对象是待测字符串。它的返回值是所有匹配的元素组成的数组。
var name = 'JeffreyWay';
alert(name.match(/e/)); // alerts "e"
结果只输出一个e,因为我们没有开启全局搜索模式呀
var name = 'JeffreyWay';
alert(name.match(/e/g)[1]); // alerts "e"
再来一个栗子
var string = 'This is just a string with some 12345 and some !@#$ mixed in.';
alert(string.match(/[a-z]+/gi)); // alerts "This,is,just,a,string,with,some,and,some,mixed,in"
[a-z]+
匹配一个或多个小写字母, gi
模式修饰符表示开启全局模式并忽略大小写。
接下来就是动手实践了,我们尝试分割email地址,w3ctrain@gmail.com,使用正则表达式把w3ctrain,gmail拿出来。
var email = 'w3ctrain@gmail.com';
alert(email.replace(/([a-z/d_-]+)@([a-z/d_-]+)/.[a-z]{2,4}/ig, '$1, $2')); // alerts "w3ctrain, gmail"
看上去挺复杂的,我们来一层一层地剥开它的洋葱片。
.replace(/([a-z/d_-]+)
搜索匹配任意小写字母,数字,下划线,减号,一个或多个~
@([a-z/d_-]+)
接下来是匹配@符号,和接下来的其他字符。
/.[a-z]{2,4}/ig,
/.
是转义字符,因为单纯的 .
在正则表达式里面是元字符,它表示匹配除了换行符之外的任意字符。所以这里匹配的是. + 2~4位的字母 (忽略大小写并开启全局模式)
'$1, $2')
最后部分是replace方法的第二个参数,用来返回与regexp中的表达式相匹配的文本。比如这个例子中,replace将返回 w3ctrain,gmail
这样的字符串,注意不是数组调用toString()输出的字符串,中间的逗号是 $1, $2
这里传过去的。$1匹配w3ctrain,$2匹配gmail。
文章的最后,我们来写一个Location对象,它的功能是对传过去的url分解成href,host,port,protocol等等。
function loc(url) {
return {
search : function() {
return url.match(//?(.+)/i)[1];
},
hash : function() {
return url.match(/#(.+)/i)[1];
},
protocol : function() {
return url.match(/(ht|f)tps?:/)[0];
},
href : function() {
return url.match(/(.+/.[a-z]{2,4})/ig);
}
}
}
serch部分是 ?
之后的所有内容;hash是 #
号之后的部分;protocol是网络协议,我们可以匹配到 http,https,ftp;href
我们这里是检测到域名结束位置,也就是.com,.cn等。
写完之后,我们可以这样用。
var l = loc('http://www.w3ctrain.com/about/#Helkyle');
alert(l.href()); // http://www.net.tutsplus.com
alert(l.protocol()); // http:
alert(l.hash()); //Helkyle
如果看完这篇文章能消除你对正则表达式的恐惧感,那就够了!!!一口吃不成胖子,路还很长,正则表达式也才刚刚开始~
细心的朋友会发现,这篇文章存在很多问题没有描述清楚,比如
var string = 'This is just a string with some 12345 and some !@#$ mixed in.';
alert(string.match(/[a-z]+/gi)); // alerts "This,is,just,a,string,with,some,and,some,mixed,in"
为什么结果是”This,is”,而不是”T,h,i,s,i,s”呢?
url.match(/(.+/.[a-z]{2,4})/ig)
为什么能匹配到整个域名???
+
匹配一个或多个是什么意思???
这些涉及正则表达式的搜索算法,推荐你再看看相关资源里面的内容,相信你能找到答案~