1. 测试字符串模式。 例如,可以测试输入字符串以查看字符串中是否存在电话号码模式或信用卡号码模式。这称为数据验证
2.替换文本。您可以在文档中使用正则表达式来标记特定文本,然后可以将其完全删除,或者替换为其他文本
3. 基于模式匹配从字符串中提取子字符串。可用于查找文本或输入数组中的特定文本
正则表达式句型
正则表达式是由普通字符(例如字符 a 到 z)和特殊字符(称为元字符)组成的文本模式。 该模式描述了在查找文字正文时要匹配的一个或多个字符串。 正则表达式充当模板,将字符模式与正在搜索的字符串进行匹配。
创建正则表达式
varre=newRegExp();//RegExp是一个对象,与Aarray相同
//但是这样没有效果,正则表达式的内容需要以字符串的形式传入
re=newRegExp("a");//最简单的正则表达式,会匹配字母a
re=newRegExp("a","i");//第二个参数表示匹配时不区分大小写
RegExp构造函数的第一个参数是正则表达式的文本内容,第二个参数是可选标志。 这些标志可以组合使用
• g(全文搜索)
• i(忽略大小写)
• m(多行搜索)
varre=newRegExp("a","gi");//匹配所有a或A
正则表达式有另一种正则表达式文字的声明形式
varre=/a/gi;
正则表达式对象的方式
• test,返回一个布尔值,强调正在搜索的字符串中是否存在模式。 如果存在则返回 true,否则返回 false。
• exec,使用正则表达式模式在字符串中运行搜索,并返回包含搜索结果的链接列表。
•编译,将正则表达式编译成内部格式,然后执行得更快。
正则表达式对象的属性
//测试方法,测试字符串,匹配模式返回true,否则返回false
varre=/he/;//最简单的正则表达式会匹配短语he
varstr="he";alert(re.test(str));//true
str="我们";alert(re.test(str));//false
str="HE";alert(re.test(str));//false,小写,如果想同时匹配大写和小写,可以指定i标志(i是ignoreCase或不区分大小写的表达式)
re=/he/i;alert(re.test(str));//true
str="当然!Helovesher!";alert(re.test(str));//true,只要包含he(HE),如果只有he或HE,则不允许有其他字符,
您可以使用 ^ 和 $
re=/^he/i;//脱字符(^)代表字符的开始位置alert(re.test(str));//false,因为他不在str的开头
str="Heisagoodboy!";
alert(re.test(str));//true,他是字符的起始位置,还需要使用$
re=/^he$/i;//$表示字符的结束位置
警报(re.test(str));//假
str="他";
alert(re.test(str));//true//其实我们无法发现正则表达式有多么强大,因为我们可以在里面的例子中使用==或者indexOf
re=/s/;//s 匹配任何空白字符,包括空格、制表符、换页符等。
str="userName";//用户名包含空格
Alert(re.test(str));//true
str="userName";//用户名包含制表符
Alert(re.test(str));//true
re=/^[az]/i;//[]匹配指定范围内的任意字符,这里会匹配英文字母,不区分大小写
str="variableName";//变量名必须以字母开头
Alert(re.test(str));//true
字符串=“123abc”;
警报(re.test(str));//假
事实上,仅仅知道字符串是否与模式匹配还不够,我们还需要知道哪些字符与模式匹配
varosVersion="Ubuntu8";//8代表系统的主版本号
varre=/^[az]+s+d+$/i;//+表示该字符必须至少出现一次,s表示空白字符,d表示数字
alert(re.test(osVersion));//true,但是我们想知道主版本号//另外一种exec的方式,返回一个链表,链表的第一个元素就是完整匹配的内容
re=/^[az]+s+d+$/i;
arr=re.exec(osVersion);
alert(arr[0]);//完整输出osVersion,因为整个字符串正好匹配re //我只需要把数字取出来
重新=/d+/;
vararr=re.exec(osVersion);
警报(arr[0]);//8
对于更复杂的用法,请使用子匹配
//exec返回的字段的第一个到第n个元素包含匹配中出现的任何子匹配
re=/^[az]+s+(d+)$/i;//使用()创建子匹配
arr=re.exec(osVersion);
alert(arr[0]);//整个osVersion,即正则表达式的完全匹配
alert(arr[1]);//8、第一个子匹配,其实也可以取出主版本号a
lert(arr.长度);//2
osVersion="Ubuntu8.10";//取出主版本号和次版本号
re=/^[az]+s+(d+).(d+)$/i;//. 是正则表达式元字符之一,需要通配符才能使用其字面意义
arr=re.exec(osVersion);
alert(arr[0]);//完成osVersion
警报(arr[1]);//8
警报(arr[2]);//10
注意,当字符串与re不匹配时,exec方法将返回null
String对象正则表达式相关的一些方法
//replace方法,用于替换字符串
varstr =“一些钱”;
Alert(str.replace("some","much"));//很多钱
//replace的第一个参数可以是正则表达式
varre=/s/;//空白字符
Alert(str.replace(re,"%"));//一些%钱
//当你不知道字符串中有多少个空白字符时,正则表达式非常方便
str="somesometsometf";
重新=/s+/;
alert(str.replace(re,"#"));//但是这只会替换一堆第一次出现的空白字符
//因为正则表达式只能匹配一次,s+匹配到第一个空格后就退出
re=/s+/g;//g,全局标志,会让正则表达式匹配整个字符串
Alert(str.replace(re,"@"));//some@some@some@
//另外一个类似的是split
varstr =“a-bd-c”;
vararr=str.split("-");//返回["a","bd","c"]
//如果用户输入str,他可能会输入a-bd-c或abdc或a_bd_c,但不会是abdc(所以他犯了错误)
str="a_db-c";//用户按照自己喜欢的形式添加分隔符
re=/[^az]/i;//后面我们说^表示字符的开头,但在[]中表示负数字符集
//匹配任意不在指定范围内的字符,这里会匹配除字母以外的所有字符
arr=str.split(re);//仍然返回["a","bd","c"];
//在字符串中搜索时,我们经常使用indexOfjavascript 正则数字,正则搜索对应的方法是search
str="Myageis18.Goldenage!";//年龄不固定javascript 正则数字,我们用indexOf找不到它的位置
重新=/d+/;
alert(str.search(re));//返回找到的字符串,起始下标10
// 注意,由于搜索本身在第一次出现时立即返回,因此搜索时无需使用 g 标志
//下面的代码看起来是正确的,但是g标志是多余的
re=/d+/g;alert(str.search(re));//始终为 10
请注意,当搜索方法没有找到匹配项时,将返回-1
与exec方法类似,String对象的match方法也用于将字符串与正则表达式进行匹配,并返回结果链表
varstr="MynameisCJ.大家好!";
varre=/[AZ]/;//匹配全部小写字母
vararr=str.match(re);//返回链表
alert(arr);//链表中只会有一个M,因为我们没有使用全局匹配
re=/[AZ]/g;
arr=str.match(re);
警报(arr);//M,C,J,H
// 从字符串中提取短语
re=/b[az]*b/gi;//b表示短语边界
str="一二三四";
Alert(str.match(re));//一、二、三、四
RegExp对象实例的一些属性
varre=/[az]/i;
alert(re.source);//输出[az]字符串
//请注意,直接alert(re)会输出正则表达式以及正斜杠和flag,这是re.toString方法定义的
RegExp对象的每个实例都有一个lastIndex属性,它是搜索字符串中下一个成功匹配的起始位置,默认值为-1。 LastIndex 属性由 RegExp 对象的 exec 和 test 方法更改。 并且它是可写的。
varre=/[AZ]/;
//exec方法执行后,re的lastIndex属性发生改变,
varstr="你好,世界!!!";
varar = 重新。 执行(str);
alert(re.lastIndex);//0,因为没有设置全局标志
re=/[AZ]/g;
arr=re.exec(str);
Alert(re.lastIndex);//1
arr=re.exec(str);
Alert(re.lastIndex);//7
当匹配失败(没有之前的匹配),或者lastIndex值小于字符串的粗细时,执行exec等方法会将lastIndex设置为0(起始位置)
varre=/[AZ]/;
varstr="你好,世界!!!";
re.lastIndex=120;
varar = 重新。 执行(str);
Alert(re.lastIndex);//0
RegExp 对象的静态属性
//input最后用来匹配字符串(传递给test、exec的字符串)
varre=/[AZ]/;
varstr="你好,世界!!!";
varar = 重新。 执行(str);
Alert(RegExp.input);//你好,世界!!!
re.exec("tempstr");
alert(RegExp.input);//Hello, World!!!,因为tempstr不匹配
//lastMatch 最后匹配的字符
re=/[az]/g;
str =“嗨”;
重新测试(str);
Alert(RegExp.lastMatch);//h
重新测试(str);
Alert(RegExp["amp;"]);//我
放大器; 是lastMatch的简称,但由于它不是合法的变量名,所以它是必需的。 。
//lastParen 最后一个匹配组
re=/[az](d+)/gi;
str="Class1Class2Class3";
重新测试(str);
Alert(RegExp.lastParen);//1
重新测试(str);
警报(RegExp["$+"]);//2
//左上下文
返回搜索字符串中从字符串开头到最后一个匹配之前的位置的字符
//rigthContext返回搜索到的字符串中从最后一个匹配位置到字符串末尾的字符
re=/[AZ]/g;
str =“123ABC456”;
重新测试(str);
Alert(RegExp.leftContext);//123
警报(RegExp.rightContext);//BC456
重新测试(str);
警报(正则表达式[“
"]);//123A
警报(正则表达式[“
"]);//C456
multiline 属性返回正则表达式是否使用多行模式。 该属性不是针对某个正则表达式实例,而是针对所有正则表达式,但该属性是可写的。 (IE和Opera不支持该属性)
警报(RegExp.multiline);
//由于IE和Opera不支持该属性,所以最好单独指定
varre=/w+/m;
警报(re.多行);
alert(RegExp["$*"]);//RegExp对象的静态属性不会被改变,因为m标志是为RegExp的对象实例指定的
RegExp.multiline=true;//这将为所有正则表达式实例打开多行匹配模式
警报(RegExp.multiline);
使用元字符的注意事项:元字符是正则表达式的一部分。 当我们想要匹配正则表达式本身时,我们必须对此类元字符使用通配符。 以下是正则表达式中使用的所有元字符
([{^$|)?*+。
varstr =“?”;
varre=/?/;
alert(re.test(str));//错误,由于?是元字符,必须是通配符
重新=/?/;
Alert(re.test(str));//true
使用RegExp构造函数以及使用正则表达式文字创建正则表达式时的注意事项
varstr =“?”;
alert(str);//只会输出?
varre=/?/;//会匹配吗?
Alert(re.test(str));//true
re=newRegExp("?");//错误,因为这相当于re=/?/
re=newRegExp("\?");//正确,会匹配吗?
Alert(re.test(str));//true
由于双通配符如此不友好,我们仍然使用正则表达式字面量的声明形式
如何在正则表达式中使用特殊字符?
//ASCII形式使用十六进制补码来表示特殊字符
varre=/^x43x4A$/;//将匹配CJ
Alert(re.test("CJ"));//true
//也可以使用八的补码形式
re=/^103112$/;// 将匹配 CJ
Alert(re.test("CJ"));//true
//也可以使用Unicode编码
re=/^u0043u004A$/;//使用Unicode,必须以u开头,后面跟字符代码的四位16补码表示
警报(重新测试(“CJ”));
除此之外,还有一些其他预定义的特殊字符,如下表所示:
人物描述
n换行符
r回车
t 制表符
f 换页符(制表符)
cX X对应的控制字符
b 退格键(退格键)
v 垂直制表符
空字符 ("")
字符类--->简单类、反向类、范围类、组合类、预定义类
//简单类
varre=/[abc123]/;//将匹配abc123的6个字符之一
// 负类
re=/[^abc]/;//将匹配abc以外的字符
// 范围类
re=/[ab]/;//将匹配大写a-b26字母
re=/[^0-9]/;//将匹配除0-910字符以外的字符
//组合类
re=/[a-b0-9A-Z_]/;//将匹配字母、数字和逗号
预定义类
相当于匹配的代码
.IE下的[^n],其他[^nr]匹配除换行符之外的任意字符
d[0-9] 匹配数字
D[^0-9] 匹配非数字字符
s[nrtfx0B] 匹配空白字符
S[^nrtfx0B] 匹配非空白字符
w[a-zA-Z0-9_] 匹配字母数字和逗号
W[^a-zA-Z0-9_] 匹配字母数字逗号以外的字符
量词(下表中的量词单独出现时均为贪婪量词)
代码说明
* 与上述子表达式匹配零次或多次。 例如,zo* 匹配“z”以及“zoo”。 * 相当于 {0,}。
+ 与上述子表达式匹配一次或多次。 例如,“zo+”匹配“zo”和“zoo”,但不匹配“z”。 + 相当于 {1,}。
? 与上述子表达式匹配零次或一次。 例如,“做什么?” 将匹配“do”或“does”中的“do”。 ? 相当于{0,1}。
{n}n 是非负整数。 比赛确定了n次。 例如,“o{2}”与“Bob”中的“o”不匹配,但与“food”中的两个 o 匹配。
{n,}n 是非负整数。 至少匹配n次。 例如,“o{2,}”不会匹配“Bob”中的“o”,但会匹配“foooood”中的所有 o。 “o{1,}”相当于“o+”。 “o{0,}”相当于“o*”。
{n,m}m 和 n 都是非负整数,其中 n