javascript核心基础(正则专题)

正则表达式

  我们在文本模式匹配,格式验证的时候经常使用正则表达式,学习过编译原理的朋友,一定对这些模式匹配不陌生(楼主编译原理不及格),由于本篇博客是一个基础性讲解,所以不会有很多复杂的模式匹配的例子,主要是JS自身的基础语法和用法,以及常用的小技巧,楼主水平有限,遇到什么有用的技巧,会再次补充,也欢迎各位网友的指教,正则表达式的学习没有必要一开始往精细里使劲。

  主要内容:正则表达式的定义,基础语法,String的正则方法,RegExp的正则方法

1.正则表达式的定义

  js的正则表达式使用RegExp对象来表示的,可以使用new RegExp()构造方法来建立,也可以像数组和类那样使用直接量语法来创建:

var pattern = /\d+s$/;//一个或多个数字以s字母结尾
//相当于下面的定义
var pattern = new RegExp("\\d+s$");
//第一种方式必须以//作为标志,就像数组以[],类以{}作为标志一样
//用第二种方法时就不用写//了,但是\必须要转义才可以

2.基础语法(以下表格一部分来自W3School,摘取了一些重要的部分)

  在正则表达式里,许多标点符号具有特殊的含义:^ $ . * + ? = ! : | \ / { } [ ] ( )   使用这些字符直接匹配的时候都要转义字符\

2.1修饰符(跟在正则式的后面例如/abc/i)

i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。

2.2方括号[]方括号用于查找某个范围内的字符:

表达式 描述
[abc] 查找方括号之间的任何字符。
[^abc] 查找任何不在方括号之间的字符。
[0-9a-zA-Z] 查找任何从 0 至 9 的数字小写 a 到小写 z 的字符大写 A 到大写 Z 的字符

 2.3元字符(Metacharacter)是拥有特殊含义的字符:

元字符 描述
. 查找单个字符,除了换行和行结束符。
\w 查找单词字符。
\W 查找非单词字符。
\d 查找数字。
\D 查找非数字字符。
\s 查找空白字符。
\S 查找非空白字符。
\b 匹配单词边界。
\B 匹配非单词边界。
\0 查找 NUL 字符。
\n 查找换行符。
\f 查找换页符。
\r 查找回车符。
\t 查找制表符。
\v 查找垂直制表符。

 2.4量词(实现重复)

量词 描述
n+ 匹配任何包含至少一个 n 的字符串。
n* 匹配任何包含零个或多个 n 的字符串。
n? 匹配任何包含零个或一个 n 的字符串。
n{X} 匹配包含 X 个 n 的序列的字符串。{}跟在后面
n{X,Y} 至少X次但不能超过Y次
n{X,} 匹配包含至少 X 个 n 的序列的字符串。

对于上面的量词都是贪婪匹配,要实现非贪婪匹配在匹配后面再加一个?即可如:+?  *? ?? {1,5}?

2.5指定匹配位置

^ : 一行的开头

$ : 一行的结尾

\b : 匹配一个单词的边界

\B : 匹配非单词的边界

(?=p) : 接下来的字符串都要跟p匹配

(?!p) :  接下来的字符串都要不跟P匹配

2.6选择,分组,引用  ()

 |  选择,匹配左右侧的表达式都可以,从左向右进行

(表达式)  组合,将几个项组合成一个单元,这个单元可以用+ * ? | 等来修饰,并且可以记住此组合匹配到的字符串以备以后引用,如第一个()引用时/1

 (?:表达式)  只组合不记忆

/n 第n个()记忆的值

3.用于模式匹配的String方法(4个)

 3.1 search() 参数是一个正则表达式,返回第一个与之相匹配的的字串的起始位置,没有匹配则返回-1 (注意在search的参数中g是不起作用的)

‘javascript‘.search(/script/i);//返回4

 

3.2 replace() 用于检索和替换,有两个参数,第一个是一个正则表达式,第二个参数是要进行替换的字符串

var text = ‘i love "javascript" , do not like "actionscript"‘;
text.replace(/script/gi,‘SCRIPT‘);//将替换掉所有的script为大写
//如果没有g修饰的话,将只替换第一个匹配的
text.replace(/script/i,‘s‘);//只替换第一个SCRIPT
//replace方法的功能远不止这些,如下面的小技巧
var quote = /"([^"]*)"/;//匹配所有被""包围的字符串
text.replace(quote,‘ ”$1“ ‘);//将会把应为的引号换位中文的引号,$1表示第一个()
//关于其他replace特点以后在做描述

 

3.3 match() 只有一个正则表达式的参数,返回一个由匹配结果组成的数组

//当有g修饰的时候,返回所有结果的数组
var array =‘1 is not 2 is not 3‘.match(/\d+/g);//[‘1‘,‘2‘,‘3‘]
//当没有g修饰啥时候,返回的依然是一个数组,但只匹配第一个,余下的元素是正则表达式中用圆括号括起来的子表达式
//匹配URL
var urlP = /(\w+):\/\/([\w.]+)\/(\s*)/;
var text =‘my blog is http://www.cnblogs.com/wychytu‘; 
var result = text.match(urlP);
if(result){
  var fulurl = result[0];//匹配到的第一个url,完整大url
  var u1 = result[1];//http
  var u2 = result[2];//www.cnblogs.com
  var u3 = result[3];//wychytu
}

 

3.4 split() 多用于把一个字符串拆分成数组,其参数也可以是正则表达式

var text = ‘1 , 2 ,3 ,4‘;
text.split(/\s*,\s*/);//[‘1‘,‘2‘,‘3‘,‘4‘]

 

4.RegExp对象及其方法(2个)

 RegExp的属性有5个:source正则表达式的文本;global布尔型,是否带有修饰符g;ignoreCase布尔型,是否带有修饰符i;multiline布尔型,是否带有m修饰符;lastIndex下一次检索的位置,可读可写

4.1 exec() 与match()方法相似,不同之处是,当同一个正则表达式调用第二次exec时,将从上次的lastIndex位置开始

while((result = pattern.exec(text)) != null){
alert(result[0]   + result.index  +pattern.lastIndex);
}

 

4.2 test()与exec()相同,exec返回值不是null是,text返回true

注意:要遍历一个字符串,挨个进行,使用RegExt比较灵活,注意使用好lastIndex属性 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。