Regular expression

Regular expression 用RegExp类表示正则表达式.

正则表达式主要用来验证客户端的输入.填写完以后,发送给服务器.
正则表达式:匹配和文本检索替换的函数.

一,创建正则表达式,提供了2种方法.new和字面量
(1)new 方式创建
var box = new RegExp(‘box‘);    //box 是必须填入的字符串参数.
document.write(box + "<br/>");    //打印出 /box/ //也是正则的边界

var box = new RegExp(‘box‘, ‘igm‘);    //第二个参数是模式修饰符
document.write(box + "<br/>");

模式修饰符:
i     代表忽略大小写
g     全局作用域
m     多行匹配

(2)字面量方式创建
var box = /box/;        //使用字面量方式的正则
alert(box);
//如果想加入修饰符的话,直接加入就可以
var box = /box/igm;
alert(box);

二,匹配正则表达式
pattern用test和exec方法来匹配
RegExp 对象的方法
方法            功能
test         在字符串中测试模式匹配,返回true 或false
exec         在字符串中执行匹配搜索,返回结果数组.

例子
(1)使用new运算符的test正则表达式
var patten = new RegExp(‘Box‘);
var str = ‘box‘;
alert(patten.test(str));        //false 区分大小写

var patten = new RegExp(‘Box‘, ‘i‘);
var str = ‘box‘;
alert(patten.test(str));        //true 忽略大小写

(2)使用字面量方式test的正则表达式
var box = /box/;
var str = ‘box‘;
alert(box.test(str));

(3)使用一条语句实现正则表达式 pattern.test(str)
alert(/box/img.test("this is a Box, that is a pox!"));

(4)使用exec来检测
var pattern = /box/img;
var str = ‘this is a box,and that is a Box.‘;
alert(pattern.exec(str));    //box
alert(typeof pattern.exec(str));    

三,使用字符串的正则表达式的方法
除了test和exec方法,String对象也提供了四个使用正则表达是的方法.
(1)match(pattern)                        返回pattern中的子串或null.
(2)replace(pattern, replacement)     用replacement替换pattern
(3)Seach(pattern)                        返回字符串中的pattern开始位置
(4)Split(pattern)                        返回字符串指定pattern拆分的数组

例子:
(1)使用match 方法获取获取匹配数组
var pattern =/box/ig;                    //忽略大小写并且全局搜素
var str =‘this is a box! that is a box.‘;
alert(str.match(pattern));                //box,box
alert(str.match(pattern).length);        //数组长度是2

(2)使用search进行查找
var pattern =/box/ig;
var str =‘this is a box! that is a box.‘;
alert(str.search(pattern));        //10
由于search方法查找的就返回,所以不存在全局g这个模式的概念.
var pattern =/xxxx/ig;
var str =‘this is a box! that is a box.‘;
alert(str.search(pattern));        //找不到返回-1

(3)使用replace替换
var pattern = /box/i;
var str = ‘this is a box, that is a box too‘;
alert(str.replace(pattern, ‘tom‘));
由于不是全局的,所以this is a tom, that is a box too.
var pattern = /box/ig;
var str = ‘this is a box, that is a box too‘;
alert(str.replace(pattern, ‘tom‘));
全局的,所以this is a tom, that is a tom too.

(5)使用split差分字符串成数组
var pattern = / /ig;
var str = ‘this is a box, that is a box too‘;
document.write(str.split(pattern));     //长度是9个
输出  this, is, a, box,, that, is, a, box, too

四,正则表达式的静态属性和实例属性
静态表达式直接调用,无需声明,而实例属性需创建正则表达式.
属性            短名        含义
input             $_         当前被匹配的字符串
lastMatch         $&         最后一个匹配字符串
lastParen         $+         最后一对圆括号内的匹配子串
leftContext     $`         最后一次匹配前的子串
multiline         $*         用于指定是否所有的表达式都用于多行的布尔值
rightContext     $‘         在上次匹配之后的子串

var pattern = /(g)oogle/;
var str = ‘This is google!‘;
pattern.test(str);                    //执行一下
alert(RegExp.input);                 //This is google!
alert(RegExp.leftContext);             //This is
alert(RegExp.rightContext);         //!
alert(RegExp.lastMatch);             //google
alert(RegExp.lastParen);             //g
alert(RegExp.multiline);             //false
PS:Opera 不支持input、lastMatch、lastParen 和multiline 属性。IE 不支持multiline 属性。导致就不用了.

RegExp对象的实例属性
属性                    含义
global                 Boolean 值,表示g 是否已设置
ignoreCase            Boolean 值,表示i 是否已设置
lastIndex             整数,代表下次匹配将从哪里字符位置开始
multiline             Boolean 值,表示m 是否已设置
Source                 正则表达式的源字符串形式
PS:以上基本没什么用。并且lastIndex 在获取下次匹配位置上IE 和其他浏览器有偏差,主要表现在非全局匹配上。lastIndex 还支持手动设置,直接赋值操作。

五.获取控制
正则表达是的元字符是包含特殊含义的字符,它们会有一些特殊的功能,可以控制匹配的模式的方式.反斜杠后的元字符将失去其特殊意义.

(1)字符类:单个字符和数字
元字符/元符号                        匹配情况
.                        匹配出换行符意外的任意字符
[a-z0-9]                    匹配括号中的字符集中的任意字符
[^a-z0-9]                    匹配任意不在括号中的字符集中的字符
\d                            匹配数字
\D                            匹配非数字,同[^0-9]相同
\w                            匹配字母和数字及_
\W                            匹配非字母和数字及_
\d                            匹配0-9之间的数字
\D                            匹配非0-9之间的数字 类似[^0-9]

(2)字符类:重复字符
元字符/元符号                            匹配情况
x?                                     匹配0 个或1 个x
x*                                     匹配0 个或任意多个x
x+                                     匹配至少一个x
(xyz)+                             匹配至少一个(xyz)
x{m,n}                             匹配最少m 个、最多n 个x

(3)字符类:空白字符
元字符/元符                            号匹配情况
\0                                     匹配null 字符
\b                                     匹配空格字符
\f                                     匹配进纸字符
\n                                     匹配换行符
\r                                     匹配回车字符
\t                                     匹配制表符
\s                                     匹配空白字符、空格、制表符和换行符
\S                                     匹配非空白字符

(4)字符类:替代字符
元字符/元符                            号匹配情况
this|where|logo                 匹配this 或where 或logo 中任意一个

(5)字符类:记录字符
元字符/元符                            号匹配情况
(string)                             用于反向引用的分组
\1 或$1                             匹配第一个分组中的内容
\2 或$2                             匹配第二个分组中的内容
\3 或$3                             匹配第三个分组中的内容

例子:
(1)点可以代替除换行符意外的任意字符.
var pattern = /g..gle/ig;
var str = ‘this is a g0agle‘;
alert(pattern.test(str));        //true
如果没有字符,或者为\n就是错误的.
var pattern = /g..gle/ig;
var str = ‘this is a g\nagle‘;        //有换行符
alert(pattern.test(str));        //false

var pattern = /g..gle/ig;
var str = ‘this is a gagle‘;        //缺少一个字符
alert(pattern.test(str));        //false

var pattern = /g..gle/ig;
var str = ‘this is a ga00gle‘;        //多了一个
alert(pattern.test(str));        //false

(2)重复匹配 * 匹配0个或者多个
var pattern = /go*gle/ig;        //o* 代表 匹配0个或多个o.
var str = ‘this is a ggle‘;        //0个是可以的
alert(pattern.test(str));        //true

(3)重复匹配 + 匹配至少一个或者多个
var pattern = /go+gle/ig;            //匹配至少1个或者多个o
var str = ‘this is a ggle‘;
alert(pattern.test(str));            //false,因为没有o

var pattern = /go+gle/ig;
var str = ‘this is a google‘;        //有2个,可以
alert(pattern.test(str));            //true

(4)匹配一个或者0个 ? 问号
var pattern = /go?gle/ig;
var str = ‘this is a google‘;        //2个o就错了
alert(pattern.test(str));            //false

var pattern = /go?gle/ig;
var str = ‘this is a gogle‘;        //一个o是对的
alert(pattern.test(str));            //true

var pattern = /go?gle/ig;
var str = ‘this is a ggle‘;            //没有也可以
alert(pattern.test(str));            //true

组合:
例如:  .?   代表任意字符,一个或者0个

(5)区间  x{m, n}        匹配最少m 个、最多n 个x
var pattern = /go{2,4}gle/ig;        //匹配2到4个o
var str = ‘this is a google‘;        //2个o
alert(pattern.test(str));            //true

绝对限定几次 比如 {2} 2次
{3,} 表示3或者3个以上

(6)字符类匹配
[a-z] 表示26个小写字母都匹配
var pattern = /go[a-z]gle/ig;
var str = ‘this is a google‘;    //o属于[a-z]
alert(pattern.test(str));        //true

var pattern = /go[a-z]gle/ig;
var str = ‘this is a go1gle‘;    //1不属于[a-z]
alert(pattern.test(str));        //false

[A-Z]    大写的A到Z
[0-9]    0到9

例如: [0-9]*        代表0次1次,或者多次的0-9的数字
var pattern = /go[a-z]*gle/ig;
var str = ‘this is a godfdsfdsgle‘;    //有很多次字符属于a-z
alert(pattern.test(str));

[^a-z]        ^符号就是取反,匹配不在括号里面的任意字符
var pattern = /go[^a-z]gle/ig;
var str = ‘this is a go1gle‘;        //1不是a-z
alert(pattern.test(str));            //true

(7)锚元素匹配
^    行首匹配
$    行尾匹配

var pattern = /^[0-9]oogle/ig;
var str = ‘9oogle‘;
alert(pattern.test(str));    //true
注意:这是一个在中括号[],外面添加的^,表示从行首匹配,放在里面是取反.
var pattern = /^[0-9]oogle/ig;
var str = ‘39oogle‘;
alert(pattern.test(str));    //false
这是因为,需要从头开始匹配,第二字符不是o,就返回错误.

var pattern = /[\W]oogle$/ig;    //结尾必须是[\W]oogle
var str = ‘!oogle is good‘;
alert(pattern.test(str));        //false

(8)\w         字母数字和下划线
var pattern = /[\w]oogle/ig;
var str = ‘_oogle‘;
alert(pattern.test(str));    //true
注意:只是下划线,除此之外都不是,比如点(.)或则斜杠等.

\W         除了字符数字和下划线以外的字符
var pattern = /[\W]oogle/ig;
var str = ‘!oogle‘;                //!不是字母,也不是数字和下划线
alert(pattern.test(str));        //true

(9)\s 匹配空白字符、空格、制表符和换行符, (一个空格)
var parrent = /go\sgle/ig;
var str = ‘go gle‘;            //一个空格
alert(parrent.test(str));    //true

var parrent = /go\sgle/ig;
var str = ‘go  gle‘;            //2个空格
alert(parrent.test(str));    //false

(10)\b 表示到达边界或者空格
var parrent = /g\sogle\b/ig;
var str = ‘g ogle‘;            //e在边界
alert(parrent.test(str));    //true

var parrent = /g\sogle\b/ig;
var str = ‘g ogle is not do‘;        //g ogle在边界.空格.
alert(parrent.test(str));

(11)      | 是或,选择模式.
var parrent = /google|baidu|bing/;        //匹配三种模式
var str = ‘www.baidu.com‘;
alert(parrent.test(str));        //true
var str1 = ‘www.bing.com‘;
alert(parrent.test(str1));        //true

(12)分组匹配 用括号括起来,代表一个字符 ()
var parrent = /google{4,8}$/img;
var str = ‘this is a google‘;
alert(parrent.test(str));        //false
错误的原因是要匹配e字母的4到8次,才可以.因为$限定了结尾.

var parrent = /(google){4,8}/img;
var str = ‘this is a google‘;
alert(parrent.test(str));    //false
错误的原因是分组之后,google代表一个字符,要4到8次google才可以.

var parrent = /goog(le){4,8}/img;
var str = ‘this is a googlelelele‘;
alert(parrent.test(str));    //true

var parrent = /goog(le){4,8}/img;
var str = ‘this is a googlelelele‘;
parrent.test(str);
alert(RegExp.$1);         //le
注意:RegExp.$1表示获取模式中第一个分组对应的匹配字符串

var parrent = /goog(le){4,8}/img;
var str = ‘this is a googlelelele‘;
document.write(str.replace(parrent, ‘<strong>$1<strong>‘));        //this is a le
$1表示匹配的第一个分组的内容,给html加粗.

var parrent = /(.*)\s(.*)/img;
var str = ‘baidu google‘;
document.write(str + "<br/>");    //baidu google
document.write(str.replace(parrent, ‘$2 $1‘));//google baidu
这段正则将分组$1和分组$2进行了交换.
贪婪                惰性
+                     +?
?                     ??
*                     *?
{n}                 {n}?
{n,}                 {n,}?
{n,m}                 {n,m}?

(13)贪婪
var parrent = /[a-z]/img;
var str = ‘baidu google‘;
document.write(str.replace(parrent, ‘1‘));    //11111 111111
这是常规替换,将每一个符合规则的字符都替换为1

var parrent = /[a-z]+/img;
var str = ‘baidu google‘;
document.write(str.replace(parrent, ‘1‘));    //1 1
这里是贪婪,将符合规则的字符串全替换为1个1.

var parrent = /[a-z]+?/;
var str = ‘baidu google‘;
document.write(str.replace(parrent, ‘1‘));    //1aidu google
这个是惰性模式,但是开启全局的模式,那么即使开启惰性模式,也要都全是1

var parrent = /8(.*)8/;
var str = ‘8google8 8google8 8google8‘;
document.write(str.replace(parrent, ‘<strong>$1</strong>‘));
//结果是google8 8google8 8google

开启了懒惰模式
var parrent = /8(.*?)8/;
var str = ‘8google8 8google8 8google8‘;
document.write(str.replace(parrent, ‘<strong>$1</strong>‘));
//结果是google 8google8 8google8,只有第一个被匹配了.

var parrent = /8(.*?)8/g;
var str = ‘8google8 8google8 8google8‘;
document.write(str.replace(parrent, ‘<strong>$1</strong>‘));
//结果是 google google google

(14) exec 返回数组
var pattern = /^[a-z]+/;
var str = ‘google 2012‘;
alert(pattern.exec(str));    //google

var pattern = /^[a-z]+\s[0-9]{4}$/;
var str = ‘google 2012‘;
alert(pattern.exec(str));    //google2012

var pattern = /^([a-z]+)\s([0-9]{4})$/;
var str = ‘google 2012‘;
document.write(pattern.exec(str));    //google 2012, google, 2012
//array[0]是整个字符串
//array[1]是第一个分组的字符串google
//array[2]是返回分组的第二个字符串:2012.

(15)捕获性分组,就是所有的分组都返回
var pattern = /^(\d+)([a-z])/;
var str = ‘123abc‘;
document.write(pattern.exec(str));    //123a,123,a
//a[0] 123a
//a[1] 123
//a[2] a

(16)非捕获性分组,只要在不需要捕获返回的分组前加上    ?: 就不会返回
var pattern = /^(\d+)(?:[a-z])/;    //a就没有返回
var str = ‘123abc‘;
document.write(pattern.exec(str));    //123a, 123

var pattern = /(a?(b?(c?)))/;
var str = ‘abc‘;
document.write(pattern.exec(str));
//第一步 a[0], 整个匹配到的字符串abc
//第二步 a[1], 匹配第一个分组 (a?(b?(c?))), abc
//第三步 a[2], 匹配第二个分组 (b?(c?)),        bc
//第四步 a[3], 匹配第三个分组 (c?),         c

(17)前瞻捕获(特定捕获,后面接着特定的字符)

var pattern = /goo(?=gle)/;        //goo后面必须跟着gle才可以
var str = ‘google‘;
alert(pattern.exec(str));        //返回goo,而不是google

var pattern = /goo(?=gle)/;        //goo后面必须跟着gle才可以
var str = ‘googge‘;
alert(pattern.exec(str));        //返回 null

(18)使用特殊字符进行捕获,用反斜杠转义,才可以匹配
var pattern = /\/\?/;        // / 和 ? 都转义了.
var str = ‘12//3d/?.!ef‘;
alert(pattern.exec(str));    

(19)换行模式
var pattern = /\d+/ig;
var str = ‘121331\n324234\n3d323432ef‘;
alert(str.replace(pattern, ‘#‘));    //都替换了

如果限定首部,那么必须开启换行模式---m
var pattern = /^\d+/igm;
var str = ‘121331\n324234\n3d323432ef‘;
alert(str.replace(pattern, ‘#‘));

五,常用的正则表达式
1.检查邮政编码 规则:6位,并且第一位不为0
var pattern = /[1-9][0-9]{5}/;
var post = 123124;
alert(pattern.test(post));

2.文件压缩包 股则:后缀名zip rar.gz,文件名是字母数字下划线
var str = ‘2-z.zip‘;
var pattren = /^[\w\-]+\.zip|rar|gz/;
alert(str.match(pattren));

3.删除多余空格
var str = ‘this is a  boy, that is   a girl.‘;
var pattern = /\s/img;
alert(str.replace(pattern, ‘‘));

4.删除首尾空格
var pattern = /^\s+/; //强制首
var str = ‘ goo gle ‘;
var result = str.replace(pattern, ‘‘);
pattern = /\s+$/; //强制尾
result = result.replace(pattern, ‘‘);
alert(‘|‘ + result + ‘|‘);
var pattern = /^\s*(.+?)\s*$/; //使用了非贪婪捕获
var str = ‘ google ‘;
alert(‘|‘ + pattern.exec(str)[1] + ‘|‘);
var pattern = /^\s*(.+?)\s*$/;
var str = ‘ google ‘;
alert(‘|‘ + str.replace(pattern, ‘$1‘) + ‘|‘); //使用了分组获取
5.简单的电子邮件验证
var pattern = /^([a-zA-Z0-9_\.\-]+)@([a-zA-Z0-9_\.\-]+)\.([a-zA-Z]{2,4})$/;
var str = ‘[email protected]‘;
alert(pattern.test(str));
var pattern = /^([\w\.\-]+)@([\w\.\-]+)\.([\w]{2,4})$/;
var str = ‘[email protected]‘;
alert(pattern.test(str));
时间: 2024-08-24 20:52:50

Regular expression的相关文章

LeetCode 10. Regular Expression Matching

https://leetcode.com/problems/regular-expression-matching/description/ Implement regular expression matching with support for '.' and '*'. '.' Matches any single character. '*' Matches zero or more of the preceding element. The matching should cover

Python正则表达式Regular Expression基本用法

资料来源:http://blog.csdn.net/whycadi/article/details/2011046   直接从网上资料转载过来,作为自己的参考.这个写的很清楚.先拿来看看. 1.正则表达式re模块的基本函数. (1)findall函数的用法 findall(rule,target[,flag])是在目标字符串中找到符合规则的字符串.参数说明:rule表示规则,target表示目标字符串,[,flag]表示的是规则选项.返回的结果是一个列表.若没找到符合的,是一个空列表. 如: 因

Java [leetcode 10] Regular Expression Matching

问题描述: Implement regular expression matching with support for '.' and '*'. '.' Matches any single character. '*' Matches zero or more of the preceding element. http://i.cnblogs.com/EditPosts.aspx?opt=1 The matching should cover the entire input string

【leetcode】Regular Expression Matching (hard) ★

Implement regular expression matching with support for '.' and '*'. '.' Matches any single character. '*' Matches zero or more of the preceding element. The matching should cover the entire input string (not partial). The function prototype should be

[LeetCode] Regular Expression Matching(递归)

Implement regular expression matching with support for '.' and '*'. '.' Matches any single character. '*' Matches zero or more of the preceding element. The matching should cover the entire input string (not partial). The function prototype should be

Python正则表达式 re(regular expression)

1. 点. .: 代表一个字符 (这个跟linux的正则表达式是不同的,那里.代表的是后面字符的一次或0次出现) 2. 转义 \\ 或者 r'\': 如 r'python\.org' (对.符号的转义) 3. ^ 非或叫做排除 如[^abc]: 任何以非a,b,c的字符 4. | 选择符 如python|perl (从python和perl选择一个) 也可以: p(ython|erl) 5. ? 可选项 如: r'(http://)?(www\.)?python\.org' (http://和w

[LeetCode] 10. Regular Expression Matching ☆☆☆☆☆

Implement regular expression matching with support for '.' and '*'. '.' Matches any single character. '*' Matches zero or more of the preceding element. The matching should cover the entire input string (not partial). The function prototype should be

LeetCode10 Regular Expression Matching

题意: Implement regular expression matching with support for '.' and '*'. '.' Matches any single character. '*' Matches zero or more of the preceding element. The matching should cover the entire input string (not partial). The function prototype shoul

Regular Expression Matching

Implement regular expression matching with support for '.' and '*'. '.' Matches any single character. '*' Matches zero or more of the preceding element. The matching should cover the entire input string (not partial). The function prototype should be