js正则表达式
Posted ~风铃~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js正则表达式相关的知识,希望对你有一定的参考价值。
js正则表达式
1、正则表达式
(1)语法
var patt=new RegExp(pattern,modifiers); 或 var patt=/pattern/modifiers;
比如:var re = new RegExp("\w+","g");
var re = /w+/g;
(2)修饰符
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。
(3)转义
"w" 是错的,正确的应该是"\w"
2、RegExp 对象属性
global RegExp 对象是否具有标志 g。
ignoreCase RegExp 对象是否具有标志 i。
multiline RegExp 对象是否具有标志 m。
lastIndex 一个整数,标示开始下一次匹配的字符位置。(上一次匹配文本之后的第一个字符的位置)
(1)不具有标志 g 和不表示全局模式的 RegExp 对象不能使用 lastIndex 属性。
(2)如果在成功地匹配了某个字符串之后就开始检索另一个新的字符串,需要手动地把这个属性设置为 0。
(3)当方法 exec() 或 test() 再也找不到可以匹配的文本时,它们会自动把 lastIndex 属性重置为 0。
source 正则表达式的源文本,不包括i、g、m。/
3、RegExp 对象方法
compile 在 1.5 版本中已废弃。 编译正则表达式。 (不掌握)
exec 检索字符串中指定的值。返回一个数组 或 null。数组中元素第一个是匹配到的值,后面的都是子表达式的值(如果存在子表达式)。
(1)如果没有子表达式,那么返回数组只有一个元素。
如果有了子表达式,那么从第二个元素开始为依次匹配到的字表达式结果的值。
(2)一次只匹配一个值,如果要全局匹配,需要循环调用exec。
var str = "Visit W3School, W33Sdf45c32h1ool is a place to study web techno34logy.";
var patt = new RegExp("\d{2}","g");
var result;
while ((result = patt.exec(str)) != null) {
document.write("result = "+result +" lastIndex = "+patt.lastIndex);
document.write("<br />");
}
(3)循环中反复地调用 exec() 方法是获得全局模式的完整模式匹配信息唯一的方法。
test 检索字符串中指定的值。返回 true 或 false。 等价于:(pattern.exec(str) != null)。
一般校验字段都使用开始和结束符来做全局匹配。比如/^d{11}$/
全局匹配g的使用:每执行一次test方法 lastIndex会改变- 貌似没啥作用。
var str = "The rain in Spain stays mainly in the plain";
var patt1 = new RegExp("ain", "g");
for(i = 0; i < 4; i++) {
document.write(patt1.test(str)+" - ");
document.write("index now at: " + patt1.lastIndex);
document.write("<br />");
}
toString 返回正则表达式的字符串。
4、String 对象的相关方法
search 找到第一个匹配的字符串,返回子串的起始位置索引或-1。(不执行全局匹配,它将忽略标志g)
match 找到一个或多个正则表达式的匹配,返回匹配到的数组或null。 (默认只匹配一次,全局匹配设置修饰符g)
regexp 必需。规定要匹配的模式的 RegExp 对象。如果该参数不是 RegExp 对象,则需要首先把它传递给 RegExp 构造函数,将其转换为 RegExp 对象。
如:str.match(/aa/i);
str.match(new RegExp(/aa/i);全局匹配aa
str.match("/aa/i"); 注意:这里匹配的是匹配/aa/i,会转换成RegExp对象,可以看出没法设置修饰符i、g。
对于子表达式的情况:
如果有全局g标识,那么不返回子表达式匹配的文本。比如返回[13522222222,13288888888,13699999999] ,如要返回可以使用 RegExp.exec()
如果没有全局g标识,那么返回子表达式匹配的文本。比如返回[13522222222,5,22222222]
var objStr="我的手机号13522222222,他的手机号13288888888,她的手机号码13699999999";
var reg=/13(d)(d{8})/;
var arr=objStr.match(reg);
//循环输出结果
for(var i=0;i<arr.length;i++){
document.write("<li>"+arr[i]+"<br>");
}
replace 替换与正则表达式匹配的子串,全局替换要加g。
str = "Visit Microsoft! Microsoft";
var txt = str.replace(/microsoft/ig,"Runoob");
(1)存在子表达式时,可以利用下面的符号:
$1、$2、...、$99 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。
$& 与 regexp 相匹配的子串。
$` 位于匹配子串左侧的文本。
$‘ 位于匹配子串右侧的文本。
$$ 直接量符号
如 : 把 "Doe, John" 转换为 "John Doe" 的形式:
name = "Doe, John";
name.replace(/(w+)s*, s*(w+)/, "$2 $1");
(2)用来替换的值可以是函数
例如下面例子实现首字母都大写aaa bbb ccc变成Aaa Bbb Ccc
name = ‘aaa bbb ccc‘;
uw=name.replace(/w+/g, function(word){
return word.substring(0,1).toUpperCase()+word.substring(1);}
);
split 把字符串分割为字符串数组,支持字符串和正则表达式。
string.split(separator,limit)
var n=str.split(" ",3); 以空格分割,最多只返回大小为3的数组。
var n=str.split(""); 这种每个字符都会分割
以上是关于js正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性