javascript基础--正则表达式

第一部分  字符

part1 元字符

正则表达式的元字符有:( [ { ? \ ^ $ + * | .

对这几个元字符依次做出解释如下:

小括号()

1.小括号主要是用来划分整体的(分组)

实例一:

var reg = new RegExp(‘(test)?‘);

‘test‘.match(reg);  //[‘test‘, ‘test‘]  首先以/test?/进行匹配,然后按照小括号里的/test/进行匹配

var reg1 = new RegExp(‘test?‘);

‘test‘.match(reg1);  //[‘test‘]

实例二:

var reg = new RegExp(‘mon( and dad)?‘);

‘mon and dad‘.match(reg);  //[‘mon and dad‘, ‘ and dad‘]  首先以整体/mon( and dad)?/匹配,然后按照小括号里的/ and dad/进行匹配

var reg1 = new RegExp(‘(mon( and dad)?)‘);

‘mon and dad‘.match(reg1);  //[‘mon and dad‘, ‘mon and dad‘, ‘ and dad‘] 首先以整体模式/(mon( and dad)?)/进行匹配,然后按照外层小括号里面的/mon( and dad)?/进行匹配,最后按照最里层括号里的/ and dad/进行匹配

‘monanddad‘.match(reg1);   //[‘mon‘, ‘mon‘, undefined]  首先以整体/(mon( and dad)?)/匹配,匹配到‘mon‘,然后由外面第一层括号里面的/mon( and dad)?/匹配,匹配到‘mon‘,然后由最里层小括号的/ and dad/匹配,匹配无结果

2.小括号其他的应用地方:反向捕获文本(下篇解释)

中括号[]

1.中括号是用来界定范围的

实例:

var reg = /[123]/;

对于这个正则,它的意思是可以匹配包含1到3这三个数值任意一个的字符串。

2.中括号也可以用在排除范围中

实例:

var reg = /[^123]/;

这个正则的意思是要匹配的字符串不能含有1到3这三个字符的任意一个

中括号中的范围也可以这么写,/[0-9]/,但是不能写成/[9-0]/,‘-‘两旁的字符是由ascii码从小到大的顺序写的。

大括号{}

大括号用来指定数量的

实例:

var reg = /1{4}/;  //这个就是匹配1111啦

但指定数量的时候也是有一些特殊的情况,比如:

var reg = /1{4,}/;   //至少连续4个1

var reg = /1{4,6}/;  //4到6个1

问号?

加号 +

星号 *

这几个也是和出现次数相关的,

?表示出现0次或1次

+表示出现至少1次

*表示出现次数随便,出现0次也行,出现多次也行

幂符号^

用在两个地方,一个是取反的意思,一个是边界符号,表示开头

实例

var reg = /[^abc]/;   //匹配除了abc的字符

管道符|

表示候选项

实例

var reg = /[red|black|yellow]/;    //匹配red 或 black 或 yellow

英文点.

可以匹配除了换行符和回车符(\r\n)以外的任意字符

转义\

dollor符$

表示字符边界,结尾

part2  预定义的特殊字符

\t 制表符

\r 回车符

\n 换行符   windows中的文本文件用\r\n来结束一行,UNIX中用\n

part3  预定义的范围

可以用一些特殊的符号来表达字符想要匹配的范围:

.   除\r\n以外的任意字符

\d  数字

\D  非数字

\s   空白(space),具体匹配的字符和具体实现有关,大部分会匹配空格符、tab符、\n \r

\S   非空白

\w   单词字符(a-zA-Z0-9_)

\W   非单词字符

part4  边界符号

表示边界的字符有^ $ \b \B,它们的具体含义是

^ 开头

$ 结尾

\b 单词边界

\B 非单词边界

\b 单词边界(单词的含义是a-zA-Z0-9_这个符号范围内的组合,所以\b匹配到的是单词字符范围以外的字符)

单词边界不会匹配出一个字符,也就是它无返回值,它只是说明了位置。四种情况可以认为是单词的边界:

(1)字符串第一个字符为单词字符,第一个字符前面的位置。

(2)字符串最后一个字符为单词字符,则最后一个字符后的位置。

(3)单词字符与非单词字符紧挨着,它俩之间的位置。

(4)非单词字符与单词字符紧挨着,它俩之间的位置。

\B 非单词边界类似\b,也是0匹配的无返回值,只是指明了位置

实例:

var reg = /\b\w+\b/g;

"12w-eefd&efrew".match(reg);   //["12w", "eefd", "efrew"]

第二部分 一些正则技巧

1.捕获--反向引用

正则表达式由小括号包裹起来的规则匹配到的值可以通过引用获取到,这就是反向引用,反向引用可以用在replace方法中,也可以用在正则表达式规则的书写中。

反向引用中的\1 \2 ..的值是从左往右的小括号依次匹配的值,也就是说分组捕获是按照正则表达式从左往右依次找寻括号来匹配的,就算有括号嵌套也如此。

实例一:匹配连续出现4次的小写字母

正则表达式可以这么写:

/([a-z])\1{3}/.test(‘aaaaa‘);   //true

或者

var reg = new RegExp(‘([a-z])\\1{3}‘);  //这里\1前面加了转义

reg.test(‘aaaa‘);   //true

上面的正则表达式的意思是:([a-z])获得一个小写字母,\1是小写字母的值,也就是匹配aa这种,ad这种就不行了。{3}对\1重复三次。

实例二:在一个字符串中,每三个字符中间插一个空格

var formatString = function(str){

  return str.replace(/(.{3})/g,  ‘$1 ‘);

}

上面的正则表达式的意思是:.是除了回车和换行之外的任意字符,它重复三次,匹配到的字符存储在$1中,然后用$1加空格替换。

实例三:一个句子中每两个单词相互交换

var switchFunc = function(str){

return str.replace(/(\S+)(\s+)(\S+)/g, ‘$3$2$1‘);

}

上面正则表达式的意思是:\S匹配非空格字符,\s匹配空格字符,匹配到的值通过replace做位置交换。

2.不捕获

(1)只分组不捕获

顾名思义,我只需要实现分组,但在反向引用的输出中,我不需要这个值,这个时候可以用(?:    )

实例一:

对‘10086.001$‘这样的字符串过滤,我只需要数值部分中的整数部分和货币符号 这两个输出,

var reg = /(\d+)(?:.?)(?:\d+)([$¥])/;

‘10086.001$‘.replace(reg,‘$1$2‘);   //"10086 $"

(2)前向查找

具体形式是(?=    ),空谈太模糊,直接上例子

实例一:

需求是这样的,我需要匹配出0-9a-z中的两个字符,并且这两个字符后面必须跟着‘aa‘,‘aa‘是不捕获的

var reg = /[0-9a-z]{2}(?=aa)/g;

‘123aatestaaoaa‘.match(reg);      //["23", "st", "ao"]

当查找到23aa可以匹配的时候,下面的查找是从23aa中的aa开始匹配的,因为aa未被捕获。

(3)后向查找(js不支持)

具体形式是(?<=   )

实例:

匹配出0-9a-z中的两个字符,并且字符前面必须有两个‘aa‘,并且‘aa‘是不捕获的

正则表达式可以这么写 /(?<=aa)[0-9a-z]{2}/g,但是js不支持

(4)前向查找匹配,匹配的规则是后面不跟有某某字符

具体形式是(?!   )

var reg = /[0-9a-z]{2}(?!aa)/g;   //查找0-9a-z的两个字符,并且这两个字符后面不跟着aa

‘123aatestaaoaa‘.match(reg);      //["12", "3a", "at", "es", "ta", "oa"]

(5)后向匹配查找,匹配的规则是前面没有某某字符(js不支持)

具体形式是(?<!     )

第三部分 关于正则表达式的一些js方法

主要介绍的有match test replace exec split search,其中属于字符串的方法有match replace split search,属于正则对象的方法有exec test

match

字符串方法,string.match(reg)

返回的是数组,数组的内容因正则是否配备‘g‘而不同,当reg为‘//g’的形式的时候,返回的数组是字符串所有匹配到的内容,当reg无g时,返回的是从左到右括号匹配到的内容。

例如:

var reg = /a(b+)(\d+)/g;

"abbb34eftab0modabbbbb6".match(reg);  //["abbb34", "ab0", "abbbbb6"] 返回的是所有匹配到内容,忽略括号

var reg1 = /a(b+)(\d+)/;

"abbb34eftab0modabbbbb6".match(reg1); //["abbb34", "bbb", "34"]  没有global返回的就是从左到右括号匹配到的内容啦

 exec

属于正则表达式的方法,RegExp.exec(string)

返回的是数组,数组内容和正则表达式中没有g时match方法返回的一样,也就是从左到右括号返回的内容

例如:

var reg = /a(b+)(\d+)/g;

reg.exec("abbb34eftab0modabbbbb6");   //["abbb34", "bbb", "34"]

var reg1 = /a(b+)(\d+)/;

reg1.exec("abbb34eftab0modabbbbb6");  //["abbb34", "bbb", "34"]

不过当正则表达式有‘g‘时,当下一次调用exec时,RegExp对象的lastIndex为上一次匹配到的字符串后紧跟的位置,所以在再次执行时,会从这个位置开始,可以循环调用exec可以得到当正则有global时match方法的结果。

var reg = /a(b+)(\d+)/g;

while( (result = reg.exec("abbb34eftab0modabbbbb6"))  != null ){

  console.info(result[0]);

}

输出为

abbb34
ab0 
abbbbb6

test 

检查字符串是否满足正则表达式,reg.test(string),能匹配到则返回true,匹配不到返回false

var reg = /\d/;

reg.test(‘abc‘);   //false

reg.test(‘123‘);  //true

第四部分 正则的实例

1.获取一个url后面的两级相对地址,比如“http://www.cnblogs.com/cy163/archive/2010/04/20/1715835.html”,提取出"/cy163/archive"

var reg = /(\b\/[^\/]+){2}/g;

“http://www.cnblogs.com/cy163/archive/2010/04/20/1715835.html”.match(reg);   //["/cy163/archive", "/2010/04", "/20/1715835.html"]

感谢:

http://www.cnblogs.com/yakun/p/3795589.html

http://www.cnblogs.com/snandy/p/3662423.html

http://www.cnblogs.com/rubylouvre/archive/2010/03/09/1681222.html

http://dragon.cnblogs.com/archive/2006/05/09/394923.html

http://www.cnblogs.com/dragon/archive/2006/05/08/394078.html

http://www.cnblogs.com/bluedream2009/archive/2009/08/08/1541585.html

时间: 2024-10-05 23:25:05

javascript基础--正则表达式的相关文章

JavaScript基础正则表达式的字面声明(012)

不出所料,正则表达式也是JavaScript的一种对象.构造正则表达式也有两种,一种是使用JavaScript内置的 new RegExp() 构造函数,另一种是我们推荐的字面声明方式: // regular expression literal var re = /\\/gm; // constructor var re = new RegExp("\\\\", "gm"); 可以看出字面声明法(Literal)更简洁,由于不必加引号,所以不用象构造函数里的参数那

javascript基础---正则表达式和字符串,数组

一.正则表达式 1.正则表达式的创建方法 var re=/abc/; var re=new RegExp("abc") var re=new RegExp(/abc/); 2.正则表达式语法 2.1简单语法 c表示一个或者多个普通字符 {n}:表示匹配的次数 {n,}:表示匹配的次数>=n {n,m}:表示匹配的次数>n,<m \:表示转义的次数 ^:表示匹配输入的字符串的开始位置(在被匹配的字符串的开始部分 来匹配) $:表示匹配输入字符串的结束位置(在被匹配的字符

JavaScript基础系列目录(2014.06.01~2014.06.08)

下列文章,转载请亲注明链接出处,谢谢! 链接地址: http://www.cnblogs.com/ttcc/tag/JavaScript%20%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%20%E6%80%BB%E7%BB%93/ 1. Javascript基础---语法(待完成) 2. JavaScript基础---数据类型(待完成) 3. JavaScript基础---Array数组(待完成) 4. JavaScript基础---正则表达式(待完成) 5. Jav

javascript中正则表达式的基础语法

× 目录 [1]定义[2]特点[3]元字符[4]转义字符[5]字符组[6]量词[7]括号[8]选择[9]断言[10]模式[11]优先级[12]局限性 前面的话 正则表达式在人们的印象中可能是一堆无法理解的字符,但就是这些符号却实现了字符串的高效操作.通常的情况是,问题本身并不复杂,但没有正则表达式就成了大问题.javascript中的正则表达式作为相当重要的知识,本文将介绍正则表达式的基础语法 定义 正则表达式(Regular Expression)是一门简单语言的语法规范,是强大.便捷.高效的

javascript之正则表达式基础知识小结

javascript之正则表达式基础知识小结,对于学习正则表达式的朋友是个不错的基础入门资料. 元字符 ^ $ . * + ? = ! : | \ / ( ) [ ] { } 在使用这些符号时需要用“\”来进行转移. 如果记不清楚那些标点符号需要转移,可以在使用标点符号时都使用反斜杠“\” 简单匹配 1.直接量 /javascript/ 匹配带有“javascript”的字符串 比如“javascript is an object-oriented scripting language” 2.[

JavaScript基础知识梳理----正则表达式

JavaScript基础知识梳理----正则表达式 1.创建 方式:---字面量:var 变量名=/表达式/模式修饰符 ---构造函数:var 变量名=new RegExp(“表达式”,“模式修饰符”) 说明: 表达式 单个字符和数字 . 匹配除换行符之外的任意字符 [a-z0-9] 匹配方括号中的任意字符 [^a-z0-9] 匹配不在方括号中的任意字符 \d 匹配数字 \D 匹配非数字 \w 匹配字母 \W 匹配非字母 空白字符 \0 匹配null字符 \b 匹配空格符 \f 匹配进纸符 \n

javascript基础知识之正则表达式(regular expression)

一种字符串匹配的模式,用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件的子串等.注意:在javascript中正则表达式也是一种对象1:创建正则表达式两种方式:隐式创建(文字量方法)和显示创建(使用构造函数)eg:文字量方法:var regExp = /pattern/flags;将文字量的正则表达式赋值给一个变量,包含在两个斜杠之间的一个或多个字符,在后一个斜杠的后面,可以指定一个或多个选项.var regExp1 = /abc/;var regExp2 = /a

javascript基础集锦_正则表达式(七)

本系列主要记录javascript中,新手比较容易搞错的地方. 这篇文章专门来说说正则表达式,相信大家在编程中会经常用到! 字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦,而且代码难以复用. 正则表达式是一种用来匹配字符串的强有力的武器.它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该

javascript基础语法——词法结构

× 目录 [1]java [2]定义 [3]大小写[4]保留字[5]注释[6]空白[7]分号 前面的话 javascript是一门简单的语言,也是一门复杂的语言.说它简单,是因为学会使用它只需片刻功夫:而说它复杂,是因为要真正掌握它则需要数年时间.实际上,前端工程师很大程度上就是指javascript工程师.前端入门容易精通难,说的是前端,更指的是javascript.本文是javascript基础语法的第一篇——词法结构 与java关系 关于javascript有这样一个说法,java和jav