RegExp对象:(正则表达式)
使用正则表达式可以快速的筛选和查找到符合要求的字符串子串,效率高,功能强大,而且可以作为参数传递给String对象的一些方法。
首先来了解如何创建正则表达式
创建方法:
1.var myRegExp = new RegExp("..."); 2.var myRegExp =/.../;
RegExp对象的属性:
G:全局匹配,不只是匹配到第一个就停下来 I:不区分大小写 M:多行标志
test()方法:检查所传入的参数字符串,确定正则表达式语法指定的字符是否与字符串中的内容相匹配,如果匹配则返回true,否则返回false
特殊字符:
文本,数字和标点符号
\d(0~9的任何数字) \D(任何非数字字符) \w(任何单词字符a~z,A~Z,0~9及下划线) \W(任何非单词字符) \s(任何空白字符) \S(任何非空白字符)
.(除换行符外的任意单个字符) [...](匹配位于方括号内的任何一个字符) [^...](匹配除方括号内的字符外的任何字符)
// 检验输入的字符是否符合只有字母,数字和空格 var input = prompt("please enter a password :") function isvalid(text){ var myRegExp = /[^a-z\d ]/i return !(myRegExp.test(text)) } if(isvalid(input)){ document.write("your password contants only valid characters") }else{ document.write("your password contants one or more invalid characters") }
重复字符:
1.{n}前一项出现n次 2.{n,}前一项出现n次及以上 3.{n,m}前一项最少为n次,最多为m次
4.? 0或1次 5.+ 1或多次 6.* 0或多次
位置字符:
1.^ 模式必须位于字符串的开头,如果是多行,模式位于一行的开头
2.$ 模式必须Wie与字符串的结束位置,如果是多行,模式位于一行的结尾
3.\b 匹配单词分界位置
4.\B 匹配非单词分界位置
// 匹配单词分界位置 var string = "hello you are my baby!" var myRegExp = /\b/g string = string.replace(myRegExp,"|") document.write(string)
// 将paul替换成Ringo var myString = "paul, paula, pauline, Paul, Paul"; document.write(myString+"<br>") var myRegExp = /\bpaul\b/g; myString = myString.replace(myRegExp,"Ringo") document.write(myString)
正则表达式的分组:
为什么要对正则表达式分组?原因很简单,将字符组合到模式中后,可以对整个字符组应用重复字符,而不是对单个字符应用重复字符。
例如:
// 匹配字符组 var string = "JavaScript,VbScript and PHP,JavaVBScript" var myRegExp=/\b(Java)?(Vb)?(Script)\b/g str = string.replace(myRegExp,"替换") document.write(str)
但是这样子匹配有一个弊端,如果字符串里面出现了单词为JavaVBScript的话也会被匹配到,可以改进为:
var string = "JavaScript,VbScript and PHP,JavaVbScript"
var myRegExp=/\b(Java|Vb)?(Script)\b/g
str = string.replace(myRegExp,"替换")
document.write(str)
分组里面提供了或运算符"|"
重用字符组:
在正则表达式中重用通过一组字符指定的模式,要引用前面的字符组,只需要输入“ \ ”和表示分组顺序的数值即可。
// 处理重复出现的字符 var string = "007,007,002,003,003,005" var myRegExp = /(\d+),\1/g var str = string.replace(myRegExp,"error") document.write(string+"<br>") document.write(str)
String对象提供的split(),replace(),match()和search()方法都支持传入RegExp对象作为参数。
例子:
1.使用split()
//区分出水果 var string = "apple,0.99,banana,0.50,peach,0.25,orange,0.75" var myRegExp = /\b[^a-z]+\b/gi var strArr = string.split(myRegExp) var show = strArr.join("<br>") document.write(show)
2.引用分组,使用符号 “ $ ”
// 引用分组 var string = "2012,2013,2014" var myRegExp = /(\d{4})/g var str = string.replace(myRegExp,"the year $1") document.write(str)
3.使用replace()
var text = "He then said 'My Name is O'Connerly, yes!that's right,O'Connerly'", myRegExp = /\B'|'\B/g, result = text.replace(myRegExp,"\"") document.write(result)
//不要忘了'是一个非单词字符,因此分界将位于它与另一个非单词字符之间
4.使用search() (返回找到匹配的位置)
对于search()方法,全局匹配标记g与此无关
5.使用match() (返回一个数组,该数组的每个元素包含一个匹配的文本)
var string = "the years were 2012,2013,2014", myRegExp = /\b\d{4}\b/g, array = string.match(myRegExp) for(i in array) document.write(array[i]+"<br>")
6.拆分HTML
document.write("<div id='output'></div>") var html = "<h2>Hello World!</h2><p>We love JavaScript!</p>", myRegExp = /<[^>\r\n]+>|[^<>\r\n]+/g, arr = html.match(myRegExp) document.getElementById("output").innerText = arr.join("\r\n")
使用RegExp对象的构造函数:
var myRegExp = new RegExp("\\d+","g"), str = "你好007,我是010", result = str.match(myRegExp) for(i in result) document.write(result[i]+"<br>")
//需要使用转义字符“\”,第二个参数为对象属性
验证电话号码:
// 验证电话号码 var myRegExp = /^(\+\d{1,3} ?)?(\(\d{1,5}\)|\d{1,5}) ?\d{3} ?\d{0,7}((x|xtn|ext|extn|extension)?\.? ?\d{2,5})?$/ 正则表达式在代码中必须占一行
拆解:
1.(\+\d{1,3} ?)? 国际号码
2.(\(\d{1,5}\)|\d{1,5}) 本地区号
3. ?\d{3} ?\d{0,7} 实际的用户号码(这里最前面可以有一个空格)
4.((x|xtn|ext|extn|extension)?\.? ?\d{2,5})? 分机号码(.表示除换行符之外的任意单个字符)
5./^$/ ^字符指定模式必须从字符串的开头处匹配,$字符表示模式必须匹配到字符串的结尾。这说明字符串必须与模式完全匹配。
验证域名:
//验证域名 ^(([a-z]#\d+?)([a-z0-9-]|#\d+?)*([a-z0-9]|#\d+?)\.)+([a-z]{2,4})$
{}里面使用的是逗号,而[]里面使用的是分号-
贪婪匹配和懒惰匹配:
由于Regex引擎是贪婪的,它会尽可能的匹配多的选项,直到匹配完。有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?,匹配到第一个马上返回,不再继续进行查找。
正则表达式,表示字符串重复个数元字符,'?,+,*,{}' 默认都会选择贪婪模式,会最大长度匹配字符串,而要切换到懒惰模式,就只是在该元字符,后面加多一个”?” 即可切换到非贪婪模式(懒惰模式)。
最后,一个例题:
下面的代码解决了什么问题?
var string = "this sentence has has a fault and and we need to fix it.", myRegExp = /(\b\w+\b) \1/g, myString = string.replace(myRegExp,"$1") document.write(myString)
答案很简单,解决了单词重复的问题