本文主要是介绍ECMA RegExp类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、RegExp类型格式:创建正则表达式可以有两种形式:一种是字面量的形式,另一种是用RegExp构造函数
字面量模式:
var expression=/pattern/flags;(pattern部分是正则表达式。每个正则可以带有一个或多个标志flags,用以标明正则表达式的行为。正则表达式的匹配模式支持下列3个标志。)
g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止;
i:表示不区分大小写模式,即在确定匹配项时忽略模式与字符串的大小写;
m:表示多行(multiline )模式。即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项。
RegExp构造函数创建:var a=new RegExp("正则表达式","匹配模式");
由于RegExp构造函数的两个参数都是字符串,所以在某些情况下需要对字符进行双重转义。所有元字符都必须双重转义。已经转移过的字符也是如此。如:\n(字符\在字符串中通常被转义为\\,而在RegExp构造函数字符串中就变成\\\\):
字面量模式 | 等价的RegExp模式的字符串 |
/\[bc\]at/ | "\\[bc\\]at" |
/\.at/ | "\\.at" |
/^\d/ (以数字开头) | "^\\d" |
2、RegExp实例属性:RegExp的每个实例都有下列属性,通过这些属性可以取得有关模式的各种信息。
global:布尔值,表示是否设置了g标志。
ignoreCase:布尔值,表示是否设置了i标志。
lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0算起。
multiline:布尔值,表示是否设置了m标志。
source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。 通过这些属性可以获知一个正则表达式的各方面信息,但却没有多大用处,因为这些信息全都包含在模式声明中。例如:
var pattern1=/\[bc\]at/i;
alert(pattern1.global);//false
alert(pattern1.ignoreCase);//true
alert(pattern1.multiline);//false
alert(pattern1.laseIndex);//0
alert(pattern1.source);//"\[bc\]at"var pattern2=new RegExp("\\[bc\\]at","i");
alert(pattern2.source);//"\[bc\]at" source属性保存的是规范形式的字符串,即字面量形式所用的字符串。
3、元字符
1)、+: 最少出现一次,最多不限,相当于量词里的{1,},例:
var i=/\d/g;
var j="12d dsf21 5";
console.log(j.match(i)); //1,2,2,1,5
如果用了+(加号)那么:
var i=/\d+/g;
var j="12d dsf21 5";
console.log(j.match(i)); //12,21,5
2)、|(或):例 :
var i=/a|b|c/g;
var j="hiuahbjc";
alert(j.replace(i,'0'));//hiu0h0j0
3)、[ ](其中任意字符):比如[abc]c //ac或bc或cc都匹配
4)、[a-z0-9](范围):a到z和0到9之间的都行
5)、[^a](排除):例:[^0-9a-z]//除了英文和数字
6)、^(出现在方括号外面表示行首)
7)、$(出现在方括号外面表示行尾)
8)、. (点):表示任意字符
9)、?(问号):表示可以有可以没有,最多出现1次,相当于{0,1}
例:电话前面可以有区号,也可以没有区号,比如021-85355165-32133,区号以0开头
(0\d{2,3}-)?[1-9]\d{7}(-\d{1,5})?
10)、* (星号):表示任意次,相当于{0,} ,例:
var i=/\d*/g;
var j="12d dsf21 5";
console.log(j.match(i)); //["12", "", "", "", "", "", "21", "", "5", ""]字母和空格出现0个数字所以也匹配
11)、 \d:表示数字相当于[0-9]
12)、\D:表示除了数字相当于[^0-9]
13)、\w:表示英文、数字、下划线 相当于[a-z0-9_]
14)、\W:表示除了英文、数字、下划线以外的字符 相当于[^a-z0-9_]
15)、\s:表示空白字符(空格、Table等)
16)、\S:表示除了空白字符
例:关于.*? 表示取前面任意长度的字符,到底一个>出现
var i="<p color="red">fffffffff</p><p>fffffffff</p>11111 ";
i.match(/<p.*?>/ig);//<p color="red">,<p>
4、量词:
1)、{n}:正好出现n次
例:电话号码第一位必须是1-9,总数为8位
[1-9]\d{7}
2)、{n,m}:最少n次,最多m次
例:QQ号现在一般5到11位,第一位不为0
[1-9]\d{4,10}
3)、{2,}:最少2次,最多不限
5、match():返回匹配的项,此为字符串对象方法,参数为要检索的字符串值或者要匹配的正则表达式。
例一:
var str="Hello world!"
document.write(str.match("world") + "<br />")//world
document.write(str.match("World") + "<br />")//null
例二:
var str="1 plus 2 equal 3"
document.write(str.match(/\d+/g))//1,2,3
6、replace():替换字符串中的字符。此为字符串对象方法,返回值为替换后的新的字符串。有两个参数,第一个参数可以是字符串或者正则表达式,第二个参数为替换的文本或生成替换文本的函数。第二个参数中的$字符有特定的含义。
字符 | 替换文本 |
$1、$2、$3、……、$99 | 与 regExp 中的第 1 到第 99 个子表达式相匹配的文本。 |
$& | 与regExp相匹配的子串 |
$` | 位于匹配子串左侧的文本 |
$' | 位于匹配子串右侧的文本 |
$$ | 直接量符号 |
在本例中,我们将把 "Doe, John" 转换为 "John Doe" 的形式:
name = "Doe, John";
name.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1");//Doe, John
例子 2:
在本例中,我们将把所有的花引号替换为直引号:
name = '"a", "b"';
name.replace(/"([^"]*)"/g, "'$1'");//"a", "b"
例3:
var str='adsf aaa ewr';
alert(str.replace('a','0'));//'0dsf aaa ewr'只替换了第一个字母a
所以此方法一般要配合正则使用 如:
var str='adsf aaa ewr';
alert(str.replace(/a/g,'0'));//'0dsf 000 ewr'
7、search():此为字符串对象方法,功能:查找,用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。此方法和indexOf()方法的区别是它还能检索正则表达式。例:
var i="abc";console.log(i.search("b"));//返回1
还可以检索正则 例:
var i="abcdefg";console.log(i.search(/ef/));//返回4
8、test()方法:此为正则对象方法,用于检测一个字符串是否匹配某个正则。参数为检测的字符串。如果参数中含有与 RegExpObject 匹配的文本,则返回 true,否则返回 false。例:
var str = "Visit W3School";
var patt1 = new RegExp("W3School");
var result = patt1.test(str);
document.write("Result: " + result);//true
9、exec():此为正则对象方法,专门为捕获组设计的。正则字面量中第一个(里的内容表示第一个捕获组,第二个(表示第二个捕获组,依次类推。接收一个参数,即要应用正则的字符串,返回值为返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。另外返回的数组包含两个额外的属性:index和input。其中index表示匹配项在字符串中的位置,而input表示应用正则表达式的字符串。在数组中,第0项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串(如果模式中没有捕获组,则该数组只包含一项)。例:
var text="mom and dad and baby";
var pattern=/mom( and dad( and baby)?)?/gi;
var matches=pattern.exec(text);
alert(matches.index);//0
alert(matches.input);//"mom and dad and baby" 还可以用RegExp.input来得到相同结果
alert(matches[0]);//"mom and dad and baby"
alert(matches[1]);//" and dad and baby"
alert(matches[2]);//" and baby"
对于exec()方法而言,即使在模式中设置了全局标志(g),它每次也只会返回一个匹配项。在不设置全局标志的情况下,在同一个字符串上多次调用exec()将始终返回第一个匹配项的信息。而在设置全局标志的情况下,每次调用exec()则都会在字符串中继续查找新匹配项,如下面的例子所示。
var text="cat, bat, sat, fat";
var pattern1=/.at/;
var matches=pattern1.exec(text);
alert(matches.index);//0
alert(matches[0]);//cat
alert(pattern1.lastIndex);//0matches=pattern1.exec(text);
alert(matches.index);//0
alert(matches[0]);//cat
alert(pattern1.lastIndex);//0var pattern2=/.at/g;
var matches=pattern2.exec(text);
alert(matches.index);//0
alert(matches[0]);//cat
alert(pattern2.lastIndex);//0matches=pattern2.exec(text);
alert(matches.index);//5
alert(matches[0]);//bat
alert(pattern2.lastIndex);//8
上面的lastIndex为正则对象的属性。表示上一次匹配文本之后的第一个字符的位置。要注意的是:IE的javascript实现在此属性上存在偏差,即使在非全局模式下此属性每次也会变化。
10、RegExp实例继承的toLocaleString()、toString()方法都会返回正则表达式的字面量,与创建正则表达式的方式无关。而valueOf()方法返回正则表达式本身,例:
var pattern=new RegExp("\\[bc\\]at","gi");
alert(pattern.toString());// /\[bc\]at/gi 输出的为字符串类型
alert(pattern.toLocaleString()); // /\[bc\]at/gi 输出的为字符串类型
alert(pattern.valueOf());// /\[bc\]at/gi 输出的是正则表达式本身(对象类型)
11、RegExp构造函数属性:RegExp构造函数包含一些属性(这些属性在其他语一言中被看成是静态属性)。这些属性适用于作用域中的所有正则表达式,并且基于所执行的最近一次正则表达式操作而变化。关于这些属性的另一个独特之处,就是可以通过两种方式访问它们。换句话说,这些属性分别有一个长属性名和一个短属性名〔Opera是例外,它不支持短属性名)。下表列出了RegExp构造函数的属性。
长属性名 | 短属性名 |
input | $_ 表示最后一次要匹配的字符串 |
lastMatch | $& 表示最近一次的匹配项 |
lastParen | $+ 表示最近一次匹配的捕获组 |
leftContent | $` 表示input字符串中lastMatch之前的文本 |
rightContent | $' 表示input字符串中lastMatch之后的文本 |
multine | $* 布尔值,表示是否所有表达式都使用多行模式 |
捕获组1~9,正则字面量中 第一个(里的内容表示第一个捕获组, 第二个(表示第二个捕获组,依次类推,最多9个 | $1至$9 |
var text="this has been a short summer";
var pattern=/(.hort)/g;
if(pattern.test(text)){
alert(RegExp.input);//this has been a short summer
alert(RegExp.leftContext);//this has been a
alert(RegExp.rightContext);//summer
alert(RegExp.lastMatch);//short
alert(RegExp.lastParen);//s
alert(RegExp.multiline);//false
}
如前所述,例子使用的长属性名都可以用相应的短属性名来代替。只不过,由于这些短属性名大都不是有效的ECMAScript标识符,因此必须通过方括号语法来访问它们。如下所示。
var text="this has been a short summer";
var pattern=/(.hort)/g;
if(pattern.test(text)){
alert(RegExp.$_);//this has been a short summer
alert(RegExp["$`"]);//this has been a
alert(RegExp["$'"]);//summer
alert(RegExp["$&"]);//short
alert(RegExp["$+"]);//s
alert(RegExp["$*"]);//false
}
捕获组$1~$9,在调用exec()或test()方法时,这些属性会被自动填充。然后我们就可以像下面那样使用它们。
var text="this has been a short summer";
var pattern=/(..)or(.)/g;
if(pattern.test(text)){
alert(RegExp.$1);//sh
alert(RegExp.$2);//t
}
即使test()方法只返回一个布尔值,但RegExp构造函数的属性$1和$2也会被匹配相应捕获组的字符串自动填充。
11、正则匹配unicode中的中文:\u4e00-\u9fa5,表示中文字编码的第一个到最后一个
这篇关于ECMA RegExp类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!