[不成体系之备忘]JS正则表达式全接触
正则表达式可以:
•测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证
•替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字
•根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字
修饰符
修饰符 | 描述 |
---|---|
i | 执行对大小写不敏感的匹配。 |
g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。 |
m | 执行多行匹配。 |
其他备忘见http://www.w3school.com.cn/js/jsref_obj_regexp.asp
http://www.iteye.com/topic/481228
我们来着重分析JS的正则表达式的一些方法以及使用
Reg.test(str)
str = "Certainly!He loves her!";
alert(re.test(str));//true,只要包含he(HE)就符合,如果要只是he或HE,不能有其它字符,则可使用^和$
exec和match
/*RegExpObject.exec(string)
返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
*/
. var someText = "web2.0 .net2.0";
var pattern = /(\w+)(\d)\.(\d)/;
var outCome_exec = pattern.exec(someText);
得到的outCome_exec值为 [web2.0, web, 2, 0]. 这是一个数组. 如果在pattern这个表达式后面加上全局g. 得到的结果还是[web2.0, web, 2, 0]. 可见exec
1. 永远匹配一次
2. 返回的数组是第一次匹配的结果和分组匹配的结果合集
如果正则表达式没有全局变量, 那么string.match得到的结果是和exec一样的. 如果有了g, match就不会返回分组捕获的结果. 比如
var someText = "web2.0 .net2.0";var pattern = /(\w+)(\d)\.(\d)/;
var outCome_matc = someText.match(pattern); //类似数组的返回值 [web2.0,web,2,0]var pattern2 = /(\w+)(\d)\.(\d)/g;
var outCome_matc2 = someText.match(pattern2); //类似数组的返回值 [web2.0,net2.0]
1. 如果没有全局变量, 那么match和exec一样
2. 有全局变量, match只返回正则表达匹配的结果集, 而不包含任何分组捕获的结果.
PS: \w的用法, \w相当于[0-9a-zA-Z], 可是在上面的表达式中(\w+)只匹配web, 却不匹配web2.
这是因为如果\w后面跟着\d, 那么\w只相当于[a-zA-Z]
search, split, replace
search, 返回匹配的表达式的开始索引. 全局变量无效. 没找到返回-1
str = "My age is 18.Golden age!";//年龄不是一定的,我们用indexOf不能查找它的位置re = /\d+/;alert(str.search(re));//返回查找到的字符串开始下标10
//下面的代码虽然不出错,但g标志是多余的
re=/\d+/g;alert(str.search(re));//仍然是10其他
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-bd-c也可能输入a bd c或a_bd_c,但不会是abdc(这样就说他输错了)
str = "a_db-c";//用户以他喜欢的方式加分隔符sre=/[^a-z]/i;//前面我们说^表示字符开始,但在[]里它表示一个负字符集
//匹配任何不在指定范围内的任意字符,这里将匹配除字母处的所有字符
arr = str.split(re);//仍返回["a","bd","c"];replace的复杂应用//计算某个字符串中9出现过的次数
var str="ADF9DF9DF9",//那个文本文件中的字符串;re=/9/gi,//匹配9
counter=0;//计数器
str.replace(re,function () {counter++;//每出现一次匹配,函数就被执行一次,函数的返回值用来替换原值
return "#";});//最后str 变成 ADF#DF#DF#"function f2c(s) {
var test = /(\d+(\.\d*)?)F\b/g; // 初始化模式。return (s.replace(test, function ($0, $1, $2) {return ((($1 - 32) * 5 / 9) + "C");}));}document.write(f2c("Water freezes at 32F and boils at 212F."));
//Water freezes at 0C and boils at 100C.PS: replace方法中的第二个参数是函数的时候, 函数里有$0,$1…..$n这样的参数, 代表正则表达式的子捕获.replace不更新RegExp全局属性.
本人在长沙, 有工作可以加我QQ4658276