您的位置:首页 > 其它

学习正则表达式

2014-07-07 11:15 204 查看
正则表达式:

简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。其作用如下: 测试字符串的某个模式。

例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。

Eg:放在"/ dddd /"定界符之间

/love/ 其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。

(一)、元字符

“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次。
“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次
“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次
(二)、几个重要的元字符的使用方法

1. \s:用于匹配单个空格符,包括tab键和换行符;

2. \S:用于匹配除单个空格符之外的所有字符;

3. \d:用于匹配从0到9的数字;

\D :匹配非数字

4. \w:用于匹配字母,数字或下划线字符;

5. \W:用于匹配所有与\w不匹配的字符;

6.[b] .[/b] :用于匹配除换行符之外的所有字符。

说明:我们可以把\s和\S以及\w和\W看作互为逆运算)

Eg:

/\s+/ 上述正则表达式可以用于匹配目标对象中的一个或多个空格字符。
/\d000/ 如果我们手中有一份复杂的财务报表,那么我们可以通过上述正则表达式轻而易举的查找到所有总额达千元的款项。

(三)定位符

1. “^”定位符规定匹配模式必须出现在目标字符串的开头 (注:如果是出现在[]之内中就被视为否定运算符)
2. “$”定位符规定匹配模式必须出现在目标对象的结尾
3. “\b”定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一
4. “\B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。
Eg:

/^hell/ 因为上述正则表达式中包含“^”定位符,所以可以与目标对象中以 “hell”, “hello”或“hellhound”开头的字符串相匹配。

/ar$/ 因为上述正则表达式中包含“$”定位符,所以可以与目标对象中以 “car”, “bar”或 “ar” 结尾的字符串相匹配。

/\bbom/ 因为上述正则表达式模式以“\b”定位符开头,所以可以与目标对象中以 “bomb”, 或 “bom”开头的字符串相匹配。

/man\b/ 因为上述正则表达式模式以“\b”定位符结尾,所以可以与目标对象中以 “human”, “woman”或 “man”结尾的字符串相匹配。

/\bbom\与\man/b\

(四)则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符

1. /[A-Z]/ 上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。

2. /[a-z]/ 上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。

3. /[0-9]/ 上述正则表达式将会与从0到9范围内任何一个数字相匹配。

4. /([a-z][A-Z][0-9])+/ 上述正则表达式将会与任何由字母和数字组成的字符串,如 “aB0” 等相匹配。

这里需要提醒用户注意的一点就是可以在正则表达式中使用 “()” 把字符串组合在一起。“()”符号包含的内容必须同时出现在目标对象中。因此,上述正则表达式将无法与诸如 “abc”等的字符串匹配,因为“abc”中的最后一个字符为字母而非数字。

(个人理解:一般都把范围写在[]中括号中,然后如果每个字符都有一个范围,再全部用()括起来。)

(五)如果希望实现“逻辑或”,就使用管道 |

Eg:

/to | too | 2/

可以匹配to 或too 或2

(六)否定符[^]——出现在【】之内

否定符 “[^]”规定目标对象中不能存在模式中所规定的字符串。

例如:/[^A-C]/ 上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。一般来说,当“^”出现在 “[]”内时就被视做否定运算符;而当“^”位于“[]”之外,或没有“[]”时,则应当被视做定位符。

(七)需要在正则表达式的模式中加入元字符

并查找其匹配对象时,可以使用转义符“\”。例如:/Th\*/ 上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。

(八)常见的使用实例

1、验证邮箱

var pattern = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9]){2,4}+/ //表示2到4位

2、校验是否全部由数字组成

var pattern = /^[0-9]{1,20}$/

3、校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串

var pattern = /^[a-zA-Z]{1}[a-zA-Z]|[_.]{4,19}$/;

4、校验用户名:只能输入1-30个以字母开头的字串

var pattern = /^[a-zA-Z]{1-30}$/

5、校验密码:只能输入6-20个字母、数字、下划线

var pattern = /^[a-zA-Z0-9_]{6,20}$/

或var pattern = /^(\w){6,30}$/

6、校验普通电话、传真号码:可以“+”开头,除数字外,可含有“-”

var pattern = /^[+]{0,1}[0-9-]$/

7、校验手机号码:必须以数字开头,除数字外,可含有“-”

var pattern = /^1[3|4|5|8][0-9]\d{4,8}$/

(九)一些数字的正则表达

1. "^\\d+$" //非负整数(正整数 + 0)

2. "^[0-9]*[1-9][0-9]*$" //正整数

3. "^((-\\d+)|(0+))$" //非正整数(负整数 + 0)

4. "^-[0-9]*[1-9][0-9]*$" //负整数

5. "^-?\\d+$" //整数

6. "^\\d+(\\.\\d+)?$" //非负浮点数(正浮点数 + 0)

7. "^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$"

8. //正浮点数
9. "^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$" //非正浮点数(负浮点数 + 0)

9. "^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$" //非正浮点数(负浮点数 + 0)

10. "^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"

11. //负浮点数
12. "^(-?\\d+)(\\.\\d+)?$" //浮点数
13. "^[A-Za-z]+$" //由26个英文字母组成的字符串

14. "^[A-Z]+$" //由26个英文字母的大写组成的字符串

15. "^[a-z]+$" //由26个英文字母的小写组成的字符串

16. "^[A-Za-z0-9]+$" //由数字和26个英文字母组成的字符串

17. "^\\w+$" //由数字、26个英文字母或者下划线组成的字符串

18. "^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$" //email地址

19. "^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$" //url

20. "^[A-Za-z0-9_]*$"

(十)常用的JavaScript验证正则表达式

1、匹配中文字符的正则表达式: [u4e00-u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

2、匹配双字节字符(包括汉字在内):[^x00-xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

3、匹配首尾空白字符的正则表达式:^s*|s*$

评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

4、匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 评注:表单验证时很实用
5、匹配网址URL的正则表达式:[a-zA-z]+://[^s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 评注:表单验证时很实用
6;匹配国内电话号码:d{3}-d{8}|d{4}-d{7}
评注:匹配形式如 0511-4405222 或 021-87888822

7、匹配腾讯QQ号:[1-9][0-9]{4,} 评注:腾讯QQ号从10000开始

8、匹配中国邮政编码:[1-9]d{5}(?!d) 评注:中国邮政编码为6位数字

9、匹配首尾空白字符的正则表达式:^s*|s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

10、配身份证:d{15}|d{18}
评注:中国的身份证为15位或18位

11、 匹配ip地址:d+.d+.d+.d+ 评注:提取ip地址时有用

(十一)javascript正则表达式的基本知识

1 javascript 正则对象创建 和用法 声明javascript 正则表达式 var reCat = new RegExp("cat"); 你也可以

var reCat = /cat/; //Perl 风格 (推荐)
2 学习最常用的 test exec match search replace split 6个方法 1) test 检查指定的字符串是否存在 var data = "123123"; var reCat = /123/gi;
alert(reCat.test(data)); //true
//检查字符是否存在 g 继续往下走 i 不区分大小写

2) exec 返回查询值

var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";

var reCat = /cat/i;
alert(reCat.exec(data)); //Cat 3)match 得到查询数组
var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";

var reCat = /cat/gi;
var arrMactches = data.match(reCat)

for (var i=0;i < arrMactches.length i++) {
alert(arrMactches[i]); //Cat cat

}
4) search 返回搜索位置 类似于indexof

var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";

var reCat = /cat/gi;
alert(data.search(reCat)); //23

5) replace 替换字符 利用正则替换
var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";

var reCat = /cat/gi;
alert(data.replace(reCat,"libinqq"));

6)split 利用正则分割数组
var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,"; var reCat = /\,/;
var arrdata = data.split(reCat); for (var i = 0; i < arrdata.length; i++) {
alert(arrdata[i]); }
3 学习下 简单类 负向类 范围类 组合类 //简单类
var data = "1libinqq,2libinqq,3libinqq,4libinqq";

var reCat = /[123]libinqq/gi;

var arrdata = data.match(reCat);

for (var i = 0; i < arrdata.length; i++)

{
alert(arrdata[i]); // 1libinqq 2libinqq 3libinqq

}

//负向类
var data = "alibinqq,1libinqq,2libinqq,3libinqq,4libinqq"; //\u0062cf

var reCat = /[^a123]libinqq/gi;

var arrdata = data.match(reCat);

for (var i = 0; i < arrdata.length; i++) {
alert(arrdata[i]); //4libinqq

}

//范围类

var data = "libinqq1,libinqq2,libinqq3,libinqq4,libinqq5"; //\u0062cf

var reCat = /libinqq[2-3]/gi;

var arrdata = data.match(reCat);

for (var i = 0; i < arrdata.length; i++) {
alert(arrdata[i]); // libinqq2 libinqq3

}

var data = "a,b,c,w,1,2,3,5"; //\u0062cf

var reCat = /[a-q1-4\n]/gi;

var arrdata = data.match(reCat);

for (var i = 0; i < arrdata.length; i++) {
alert(arrdata[i]); // a b c 1 2 3

}
这些都是 js正则 最基本的使用方法,看不会的请复制到笔记本练习下,
看会了再往下面看。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: