精通正则表达式(2)

正则表达式还有另一种正则表达式字面量的声明方式

正则表达式语法参考

var=/a/gi   两个/线分隔是模式,最后g表示全局,i表示字母不区分大小

正则表达式对象的方法:

  • test,返回一个 Boolean 值,它指出在被查找的字符串中是否存在模式。如果存在则返回 true,否则就返回 false。
  • exec,用正则表达式模式在字符串中运行查找,并返回并含该查找结果的一个数组。
  • compile,把正则表达式编译为内部格式,从而执行得更快。

正则表达式对象的属性

  • source,返回正则表达式模式的文本的复本。只读。
  • lastIndex,返回字符位置,它是被查找字符串中下一次成功匹配的开始位置。
  • $1…$9,返回九个在模式匹配期间找到的、最近保存的部分。只读。
  • input ($_),返回执行规范表述查找的字符串。只读。
  • lastMatch ($&),返回任何正则表达式搜索过程中的最后匹配的字符。只读。
  • lastParen ($+),如果有的话,返回任何正则表达式查找过程中最后括的子匹配。只读。
  • leftContext ($`),返回被查找的字符串中从字符串开始位置到最后匹配之前的位置之间的字符。只读。
  • rightContext ($’),返回被搜索的字符串中从最后一个匹配位置开始到字符串结尾之间的字符。只读。

String对象一些和正则表达式相关的方法

  • match,找到一个或多个正则表达式的匹配。
  • replace,替换与正则表达式匹配的子串。
  • search,检索与正则表达式相匹配的值。
  • split,把字符串分割为字符串数组。

下面举实例来说明如何应用


re = /\s/;// \s匹配任何空白字符,包括空格、制表符、换页符等等  
str= "user Name";//用户名包含空格  
alert(re.test(str));//true  
str = "user     Name";//用户名包含制表符  
alert(re.test(str));//true  

re = /^[a-z]+.$/i;  //^表示开始 $表示字符结束位置  
alert(re.test("hi111tt"));//false
alert(re.test("h."));    //true

var re = /^[a-z]+\s+\d+$/i; //+号表示字符至少要出现1次,\s表示空白字符,\d表示一个数字 
alert(re.test("abc 11222")); //true
alert(re.test("abc 11222abc")); //fals
//当时我们想取出里面的数字
re = /\d+/
var result = re.exec(str);
alert(result); //11222 

//更复杂的用法,使用子匹配 
//exec返回的数组第1到n元素中包含的是匹配中出现的任意一个子匹配  
re=/^[a-z]+\s+(\d+)$/i;//用()来创建子匹配  
arr =re.exec(osVersion);  
alert(arr[0]);//整个osVersion,也就是正则表达式的完整匹配  
alert(arr[1]);//8,第一个子匹配,事实也可以这样取出主版本号  
alert(arr.length);//2  
osVersion = "Ubuntu 8.10";//取出主版本号和次版本号  
re = /^[a-z]+\s+(\d+)\.(\d+)$/i;//.是正则表达式元字符之一,若要用它的字面意义须转义  
arr = re.exec(osVersion);  
alert(arr[0]);//完整的osVersion  
alert(arr[1]);//8  
alert(arr[2]);//10  
//String对象的一些和正则表达式有关的方法 

//replace方法,用于替换字符串  
var str ="some money";  
alert(str.replace("some","much"));//much money  

//replace的第一个参数可以为正则表达式  
var re = /\s/;//空白字符  
alert(str.replace(re,"%"));//some%money  

//在不知道字符串中有多少空白字符时,正则表达式极为方便  
str ="some some             \tsome\t\f";  
re = /\s+/;  
alert(str.replace(re,"#"));//但是这样只会将第一次出现的一堆空白字符替换掉  

//因为一个正则表达式只能进行一次匹配,\s+匹配了第一个空格后就退出了  
re = /\s+/g;  //g,全局标志,将使正则表达式匹配整个字符串  
alert(str.replace(re,"@"));//some@some@some@  

//另一个与之相似的是split,以某个字符分隔  
var str = "a-bd-c";  
var arr = str.split("-");//返回["a","bd","c"]  

str = "a_db-c";//用户以他喜欢的方式加分隔符s  
re=/[^a-z]/i;//前面我们说^表示字符开始,但在[]里它表示一个非字符集  
//匹配任何不在指定范围内的任意字符,这里将匹配除字母处的所有字符  
arr = str.split(re);//仍返回["a","bd","c"]; 

//在字符串中查找时我们常用indexOf,与之对应用于正则查找的方法是search,找不到返回-1  
str = "My age is 18.Golden age!";//年龄不是一定的,我们用indexOf不能查找它的位置  
re = /\d+/;  
alert(str.search(re));//返回查找到的字符串开始下标10  
//注意,因为查找本身就是出现第一次就立即返回,所以无需在search时使用g标志  
//下面的代码虽然不出错,但g标志是多余的  
re=/\d+/g;  
alert(str.search(re));//仍然是10 

var str = "My name is Chenfei.Hello everyone!";  
var re = /[A-Z]/;//匹配所有大写字母  
var arr = str.match(re);//返回数组  
alert(arr);//数组中只会包含一个M,因为我们没有使用全局匹配  
re = /[A-Z]/g;  
arr = str.match(re);  
alert(arr);//M,C,J,H  
//从字符串中抽取单词  
re = /\b[a-z]*\b/gi;//\b表示单词边界  *表示0个或多个 
str = "one two three four";  
alert(str.match(re));//one,two,three,four

//RegExp对象的静态属性 
//input 最后用于匹配的字符串(传递给test,exec方法的字符串)  
var re = /[A-Z]/;  
var str = "Hello,World!!!";  
var arr = re.exec(str);  
alert(RegExp.input);//Hello,World!!!  
re.exec("tempstr");  
alert(RegExp.input);//仍然是Hello,World!!!,因为tempstr不匹配  

//lastMatch 最后匹配的字符  
re = /[a-z]/g;  
str = "hi";  
re.test(str);  
alert(RegExp.lastMatch);//h  
re.test(str);  
alert(RegExp["$&"]);//i  ,$&是lastMatch的短名字,但由于它不是合法变量名,所以要。。  

//lastParen 最后匹配的分组  
re = /[a-z](\d+)/gi;  
str = "Class1 Class2 Class3";  
re.test(str);  
alert(RegExp.lastParen);//1  
re.test(str);  
alert(RegExp["$+"]);//2  

//leftContext  返回被查找的字符串中从字符串开始位置到最后匹配之前的位置之间的字符  
//rigthContext 返回被搜索的字符串中从最后一个匹配位置开始到字符串结尾之间的字符  
re = /[A-Z]/g;  
str = "123ABC456";  
re.test(str);  
alert(RegExp.leftContext);//123  
alert(RegExp.rightContext);//BC456  
re.test(str);  
alert(RegExp["$`"]);//123A  
alert(RegExp["$'"]);//C456 

re = /[A-Z]+/g;  
str = "123ABC456";  
re.test(str);  
alert(RegExp.leftContext);//123  
alert(RegExp.rightContext);//456 

//使用元字符注意事项:元字符是正则表达式的一部分,当我们要匹配正则表达式本身时,//必须对这些元字符转义.下面是正则表达式用到的所有元字符 
( [ { \ ^ $ | ) ? * + . 
var str = "?";  
var re = /?/;  
alert(re.test(str));//出错,因为?是元字符,必须转义  
re = /\?/;  
alert(re.test(str));//true

下面是正则表达式中的预定义类 
代码  等同于                  匹配 
.     IE下[^\n],其它[^\n\r]  匹配除换行符之外的任何一个字符 
\d    [0-9]                   匹配数字 
\D    [^0-9]                  匹配非数字字符 
\s    [ \n\r\t\f\x0B]         匹配一个空白字符 
\S    [^ \n\r\t\f\x0B]        匹配一个非空白字符 
\w    [a-zA-Z0-9_]            匹配字母数字和下划线 
\W    [^a-zA-Z0-9_]           匹配除字母数字下划线之外的字符     

量词(下表量词单个出现时皆是贪婪量词)

  • * 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。 * 等价于{0,},表示可以有0个或多个o。

  • + 匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。

  • ? 匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “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 <= m。最少匹配 n 次且最多匹配 m 次。刘, “o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值