本篇博客介绍一些正则表达式相关的语法以及一些字符串的方法。
什么是正则表达式?
正则表达式(Regular Expression,在代码中常简写为regex,regexp或RE),又称为规则表达式。主要用来定义一些字符串的规则,使得计算机可以根据正则表达式来检查一个字符串是否符合规则。
正则表达式的创建
正则表达式有两种创建方式:
- 使用构造方法创建;语法:
var reg = new RegExp("正则表达式", "匹配模式");
; - 使用字面值常量创建;语法:
var reg = /正则表达式/匹配模式;
;
两种方法都可以用来创建一个正则表达式,使用字面量创建更加简单,使用构造函数创建更加灵活(构造函数中传入的是字符串,可以传入一个变量)。
常用的匹配模式:
- i:忽略大小写;
- g:全局匹配。
正则表达式的简单使用
正则表达式对象中有一个test()
方法,使用这个方法可以检查一个字符串是否符合正则表达式的规则,符合规则返回true,否则返回false。
// 创建一个正则表达式
// 该正则表达式可以用来检查一个字符串中是否含有a或A,忽略大小写
var reg = /a/i;
// 验证下面三个字符串是否符合正则表达式的规则
document.write("reg.test(\"abcdeg\"): " + reg.test("abcdeg") + "<br />");
document.write("reg.test(\"bcAdeg\"): " + reg.test("bcAdeg") + "<br />");
document.write("reg.test(\"bcdeg\"): " + reg.test("bcdeg") + "<br />");
正则表达式的基本语法
我们通过一些简单的需求来介绍基本语法:
[]
:[]中的内容表示或的关系,和|一样;如:[ab]
表示a或b,a|b
也表示a或b。
检查一个字符串中是否含有a或b:
// 检查字符串中是否包含a或b
var reg1 = /[ab]/;
var reg2 = /a|b/;
document.write("reg1: " + reg1 + "<br />");
document.write("reg1.test(\"acdeg\"): " + reg1.test("acdeg") + "<br />");
document.write("reg1.test(\"bcdeg\"): " + reg1.test("bcdeg") + "<br />");
document.write("reg1.test(\"cdeg\"): " + reg1.test("cdeg") + "<br /><br />");
document.write("reg2: " + reg2 + "<br />");
document.write("reg2.test(\"acdeg\"): " + reg2.test("acdeg") + "<br />");
document.write("reg2test(\"bcdeg\"): " + reg2.test("bcdeg") + "<br />");
document.write("reg2test(\"cdeg\"): " + reg2.test("cdeg") + "<br />");
[a-z]
表示a或b或c…或z,表示任意小写字母;同样的[A-Z]
表示任意大写字母;[0-9]
表示任意数字。
检查一个字符串中是否包含任意小写字母:
// 检查是否包含任意小写字母
var reg = /[a-z]/;
document.write("reg: " + reg + "<br />");
document.write("reg.test(\"ae86\"): " + reg.test("ae86") + "<br />");
document.write("reg.test(\"9527\"): " + reg.test("9527") + "<br />");
检查一个字符串中是否包含xyz或xaz或xuz:
// 检查是否包含xaz或xuz或xyz
var reg = /x[auy]z/;
document.write("reg: " + reg + "<br />");
document.write("reg.test(\"xaz\"): " + reg.test("xaz") + "<br />");
document.write("reg.test(\"xuz\"): " + reg.test("xuz") + "<br />");
document.write("reg.test(\"xyz\"): " + reg.test("xyz") + "<br />");
document.write("reg.test(\"xyy\"): " + reg.test("xyy") + "<br />");
[^]
:表示除了,如:[^ab]
表示除了a和b。
检查字符串中是否包含除了xyz之外的字符:
// 检查是否包含除了xyz的其他字符
var reg = /[^xyz]/;
document.write("reg: " + reg + "<br />");
document.write("reg.test(\"xyz\"): " + reg.test("xyz") + "<br />");
document.write("reg.test(\"x\"): " + reg.test("x") + "<br />");
document.write("reg.test(\"y\"): " + reg.test("y") + "<br />");
document.write("reg.test(\"z\"): " + reg.test("z") + "<br />");
document.write("reg.test(\"axyz\"): " + reg.test("axyz") + "<br />");
量词:
{n}
:正好出现n次,如:a{3}
等价于aaa
;{m,n}
:出现m~n
次,如:a{1~3}
等价于a|aa|aaa
;{m,}
:出现m次及以上;+
:出现至少一次,等价于{1,}
;*
:出现0次或多次,等价于{0,}
;?
:出现0次或一次,等价于{0,1}
。
注意:量词只对它前边的一个内容起作用。
检查一个字符串中是否包含xyzxyzxyzxyz:
// 检查是否包含xyzxyzxyzxyz
var reg = /(xyz){4}/;
document.write("reg: " + reg + "<br />");
document.write("reg.test(\"xyzxyzxyzxyz\"): " + reg.test("xyzxyzxyzxyz") + "<br />");
document.write("reg.test(\"xyzxyz\"): " + reg.test("xyzxyz") + "<br />");
^
:表示以什么开头,如^a
:表示以a开头;
$
:表示以什么结尾,如a$
:表示以a结尾;
检查一个字符串是否以abc开头或以xyz结尾:
// 检查一个字符串是否以abc开头或以xyz结尾
var reg = /^abc|xyz$/;
document.write("reg: " + reg + "<br />");
document.write("reg.test(\"abcxyz\"): " + reg.test("abcxyz") + "<br />");
document.write("reg.test(\"abchehe\"): " + reg.test("abchehe") + "<br />");
document.write("reg.test(\"hehexyz\"): " + reg.test("hehexyz") + "<br />");
document.write("reg.test(\"hehe\"): " + reg.test("hehe") + "<br />");
下面看一个例子:
// 检查一个字符串是否为s
// 以s开头,立刻结束,只能是s
var reg = /^s$/;
document.write("reg: " + reg + "<br />");
document.write("reg.test(\"s\"): " + reg.test("s") + "<br />");
document.write("reg.test(\"bs\"): " + reg.test("bs") + "<br />");
document.write("reg.test(\"sb\"): " + reg.test("sb") + "<br />");
小练习,创建一个正则表达式,用来检查一个字符串是不是一个合法的手机号:
首先,我们来分析,手机号第一位只能是1,第二位只能是3~9的数字,剩余的9位可以是任何数字。
// 检测一个字符串是不是一个合法的手机号
var reg = /^1[3-9][0-9]{9}$/;
document.write("reg: " + reg + "<br />");
document.write("reg.test(\"15599631399\"): " + reg.test("15599631399") + "<br />");
document.write("reg.test(\"12599631399\"): " + reg.test("12599631399") + "<br />");
document.write("reg.test(\"32599631399\"): " + reg.test("32599631399") + "<br />");
元字符:
\w
:任意字母、数字和下划线;\W
:与\w相反,除了字母、数字和下划线;\d
:任意数字,等价于[0-9];\D
:和\d相反,除了数字;\s
:空格;\S
:和\s相反,除了空格;\b
:单词边界;\B
:和\b相反,除了单词边界;.
:表示任意字符,如果想要在表达式中使用.
需要使用\
进行转义,即:\.
。
小练习:创建一个正则表达式,检测一个字符串是否是一个合法的邮箱格式。
邮箱格式如:xxx@xxx.com
。我们规定@前的xxx
可以使用数字、字母和下划线,长度必须在2~10之间,@后的xxx
只能是字母或数字。
// 检测一个字符串是否符合邮箱格式
var reg = /^\w{2,10}@[A-Za-z0-9]{2,10}\.com$/;
document.write("reg: " + reg + "<br />");
document.write("reg.test(\"hehe@163.com\"): " + reg.test("hehe@163.com") + "<br />");
document.write("reg.test(\"420876@qq.com\"): " + reg.test("420876@qq.com") + "<br />");
document.write("reg.test(\"##sf@126.cn\"): " + reg.test("##sf@126.cn") + "<br />");
正则表达式在字符串相关方法中的使用
split()
将一个字符串拆分为数组,可以传入一个正则表达式,就可以根据正则表达式匹配到的字符串进行切分。
var str = "1A2B3C4D5E6F7G";
var reg = /[A-Z]/;
// 根据任意字母切分字符串
var result = str.split(reg);
alert("result: " + result);
search()
检索与正则表达式相匹配的内容,如果搜索到指定内容,返回第一次出现的索引;如果没有搜到,返回-1。可以接收一个正则表达式作为参数,然后会根据正则表达式去检索字符串。
var str = "abcxyzxyzxyzabc";
var reg = /(xyz){3}/;
// 查找匹配的字符串
var result = str.search(reg);
alert("result: " + result);
match()
可以根据正则表达式,从一个字符串中将符合条件的内容提取出来,默认情况下match只会找到第一个符合要求的内容,找到以后就停止检索,我们可以设置正则表达式为全局匹配模式,这样就会匹配到所有的内容。可以为一个正则表达式设置多个匹配模式,且顺序无所谓,match会将匹配到的内容封装到一个数组中返回。
var str = "abcxyAbczxaBcbcxyzaECheheabch";
var reg = /a[be]c/ig;
// 将匹配的内容提取出来
var result = str.match(reg);
alert("result: " + result);
replace()
可以将字符串中指定的内容替换为新的内容,默认只会替换匹配到的第一个,可以将正则表达式设置为全局匹配模式,替换全部。
var str = " admin ";
var regex = /^\s*|\s*$/g;
// 将字符串的左右空格全部替换为空串
var result = str.replace(regex, "");
alert("result: [" + result + "]");