2011-7-7
整理一下正则表达式,之前在学其他语言的时候有接触过,但都是匆匆而过,没有仔细看,很快又忘了,其实这些内容各门语言都一样,只有小差别,今天先把一些最为浅的,最为常用的部分整理一遍。
一 创建正则表达式对象
var pattern =/ s$/ //直接量语法创建RegExp对象。
var pattern = new RegExp(“s$”) //构造函数方法
直接量字符
正则表达式中所有的字母字符和数字都是按照直接量与自身相匹配的。但是一些非字母字符则要借助于反斜杆(\)转意字符。二者统称为正则表达式的直接量字符。见表:
将单独的直接量字符放进方括号内就可以组成字符类。
字符类
重复
贪婪重复
非贪婪的重复
没看懂^^,主要是在重复字符后面追加问号。
选择、分组和引用
正则表达式的选择、分组和引用
举些例子:
选择:/ ab | cd | ef / 匹配的是字符串“ab”、”cd”、 “ef”中的任意一个字符串。
组合:(1) / java(script) ? / script字符串被组合成一个单元,这个单元就像前面所看见的一个直接量字符,它和?一起用的时候表示,script可选,即匹配”java”或”javascript”。
(2) / [‘ ”][^’ “]*[‘ “]/ 和 / [‘ ”][^’ “]*\1/ 有什么区别? 区别就是前者可以匹配字符串“a”,也可以匹配字符串“a’;而后者只能匹配“a”,或‘a’。那么,“\1”的作用是什么?在同一个正则表达式中,用“\n”(在后部)来引用前面的子表达式。第一个正则表达式中第一个引号和第二个引号可以一样也可以不一样,如第一个为单引号,而第二个为双引号;但第二个正则表达式的第一个引号和第二个引号一定是相同的。而第二个表达式的\1的意思是引用该正则表达式中的第一个子表达式,而且,引用的不是子表达式模式([‘ ”]),而是引用第一个子表达式的匹配的文本(意思是,如果第一个子表达式匹配的是单引号,那么引用的就是一个单引号)
(3)/ ( [Jj]ava(?:[Ss]cript)? ) \sis\s(fun\w*) / 和/ ( [Jj]ava([Ss]cript)? ) \sis\s(fun\w*) / 又有什么区别?即(?:…)和()同样用来把元素组合为一个单元,有什么区别?那就是前者不作为上一例子提到的\n 把引用,而后者可以,也就是说,如果在各自的正则表达式里增加\2,那么前者引用的是(fun\w*)匹配的结果,后者则引用([Ss]cript)? )匹配的结果。
正则表达式的锚字符,指定匹配的位置
例子:
/^javascript$/ 可以匹配字符串“javascirpt”;
/\bjava\b/ 匹配单个“java”,而不能匹配“javascirpt”;
/\B[Ss]cript/ 匹配“javascirpt”,或者“vbscript”,但不匹配“script”或者”scirpting”
/java(scirpt)?(?=\:)/ 匹配”javascript:The Definitive Guide”,但不能匹配“javascript in fun”因为匹配的条件是javascript或java 随后要跟一个冒号。
标志
标志在表达式模式串的“/”之外。
2011-7-10
二 使用正则表达式
String
RegExp
String进一步
Replace的第二个参数可以利用正则表达式的“记忆功能”,用$n可以引用第一个参数(正则表达式)相应的与子表达式相匹配的结果。如:
Var Text = ' " 这里是第一个子表达式匹配的内容" ';
Var quote= /" ( [^\"]*)" / g //正则表达式中只有一个括号,即只有一个子表达式
Text.replace(quote, "“$1”"); //$1为第一个子表达式匹配的结果,即字符串" 这里是第一个子表达式匹配的内容" ,替换的结果是英文引号变为了中文格式的引号即“这里是第一个子表达式匹配的内容”
Match注意正则表达式非全局搜索
如果是全局搜索返回数组是所有的匹配结果,这没什么复杂。如果不是全局搜索,那么数组的第一个元素是匹配的字符串,余下的元素是正则表达式中用括号括起来的子表达式。
实验一下
Var url = /(\w+):\ / \ //( [\w.]+)\ /(\S*) /; //非全局搜索 Var text =" Visit my blog at http:// / www.example.com/~david" Var result = text.match(url); If(result!=null){ Var fullurl = result[0]; //第一个元素是匹配结果 Var protocol = result[1]; //下标为i 的元素是正则表达式中第i个子表达式的匹配结果 Var host = result[2]; Var path = result[3];
除此之外,非全局的正则表达式返回的数组还有两个属性——index和input, 前者字符串中匹配开始处的字符的位置,例如这里是17,后者是目标字符串的一个副本,例如这里是“Visit my blog at http:// / www.example.com/~david"”。
RegExp进一步
exec注意全局搜索
当有一个g标志的正则表达式调用exec()时,它将把该正则表达式对象的lastIndex属性设置为紧接着匹配子串的字符位置。当同一个正则表达式第二次调用exec()时,它将从lastIndex属性所指示的字符处开始检索。如果没有发现任何匹配,它会将lastIndex属性重置为0.
实验一下
Var pattern =/ java/g Var text = " javascript is more fun than java!"; Var result ; While((result = pattern.exec(text))! = null ){ Alert("Matched ' " +result[0]+ " ' "+ " at position "+result.index + "; next search begins at " + pattern .lastIndex); }