2009年5月4日星期一
深入浅出正则表达式
ps:这里是以javascript的正则表达式为蓝本。创建:
一个文本格式或正则表达式构造函数
文本格式:/pattern/flags
正则表达式构造函数:newRegExp(pattern[,flags]);
参数说明:
pattern--一个正则表达式文本
flags--如果存在,将是以下值:
g:全局匹配
i:忽略大小写
gi:以上组合
()可以取得匹配的值
在最后加上$的意思是匹配到最后,后面什么都没有了
在前面加上^的意思是匹配到最前面,前面什么都没有了
\w\W之类的定义符只能匹配一个字符,后面一般都带有+,*,{n},{n,m}
group,0匹配的是全局的字符串,从1往后匹配每个()里的字符串
用法一:varpattern=newRegExp(([a-zA-Z0-9.]+),ig);
result=pattern.exec(content);
用法二:String.replace(//g,);
如果使用String.replace(/\n/g,);必须使用//作为pattern的标志,否则replace会认为是字符串,只做第一次替换。
正则表达式对象的属性及方法
预定义的正则表达式拥有有以下静态属性:input,multiline,lastMatch,lastParen,leftContext,rightContext和$1到$9。其中input和multiline可以预设置。其他属性的值在执行过exec或test方法后被根据不同条件赋以不同的值。许多属性同时拥有长和短(perl风格)的两个名字,并且,这两个名字指向同一个值。(JavaScript模拟perl的正则表达式)
正则表达式对象的属性
属性含义
$1...$9如果它(们)存在,是匹配到的子串
$_参见input
$*参见multiline
$参见lastMatch
$+参见lastParen
$`参见leftContext
$'参见rightContext
constructor创建一个对象的一个特殊的函数原型
global是否在整个串中匹配(bool型)
ignoreCase匹配时是否忽略大小写(bool型)
input被匹配的串
lastIndex最后一次匹配的索引
lastParen最后一个括号括起来的子串
leftContext最近一次匹配以左的子串
multiline是否进行多行匹配(bool型)
prototype允许附加属性给对象
rightContext最近一次匹配以右的子串
source正则表达式模式
lastIndex最后一次匹配的索引
正则表达式对象的方法
方法含义
compile正则表达式比较
exec执行查找
test进行匹配
toSource返回特定对象的定义(literalrepresenting),其值可用来创建一个新的对象。重载Object.toSource方法得到的。
toString返回特定对象的串。重载Object.toString方法得到的。
valueOf返回特定对象的原始值。重载Object.valueOf方法得到
*0次--多次+1--多次?0--1{n}n次{n,m}n次到m次构造匹配于字符x字符x\\反斜线字符\0n八进制值的字符0n(0=n=7)\0nn八进制值的字符0nn(0=n=7)\0mnn八进制值的字符0mnn0mnn(0=m=3,0=n=7)\xhh十六进制值的字符0xhh\uhhhh十六进制值的字符0xhhhh\t制表符('\u0009')\n换行符('\u000A')\r回车符('\u000D')\f换页符('\u000C')\a响铃符('\u0007')\e转义符('\u001B')\cxT对应于x的控制字符x字符类[abc]a,b,orc(简单类)[^abc]除了a、b或c之外的任意字符(求反)[a-zA-Z]a到z或A到Z,包含(范围)[a-z-[bc]]a到z,除了b和c:[ad-z](减去)[a-z-[m-p]]a到z,除了m到p:[a-lq-z][a-z-[^def]]d,e,或f预定义的字符类.任意字符(也许能与行终止符匹配,也许不能)\d数字:[0-9]\D非数字:[^0-9]\s空格符:[\t\n\x0B\f\r]\S非空格符:[^\s]\w单词字符:[a-zA-Z_0-9]\W非单词字符:[^\w]
常用的匹配表达式
匹配中文字符的正则表达式:[\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
String.prototype.len=function(){returnthis.replace([^\x00-\xff]/g,aa).length;}
匹配空行的正则表达式:\n[\s|]*\r
匹配HTML标记的正则表达式:/(.*).*\/\1|(.*)\//
匹配首尾空格的正则表达式:(^\s*)|(\s*$)
应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:
String.prototype.trim=function()
...{
returnthis.replace(/(^s*)|(s*$)/g,);
}
利用正则表达式分解和转换IP地址:
下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:
functionIP2V(ip)
...{
re=/(d+).(d+).(d+).(d+)/g//匹配IP地址的正则表达式
if(re.test(ip))
...{
returnRegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
...{
thrownewError(NotavalidIPaddress!)
}
}
不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:
varip=10.100.20.168
ip=ip.split(.)
alert(IP值是:+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w-./?%=]*)?
利用正则表达式去除字串中重复的字符的算法程序:
[注:此程序不正确,原因见本贴回复]
vars=abacabefgeeiivars1=s.replace(/(.).*1/g,$1)varre=newRegExp([+s1+],g)vars2=s.replace(re,)alert(s1+s2)//结果为:abcefgi
我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法,最终没有找到,
这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符,
再以重复的字符建立第二个表达式,取到不重复的字符,两者串连。
这个方法对于字符顺序有要求的字符串可能不适用。
得用正则表达式从URL地址中提取文件名的javascript程序,如下结果为page1
s=http://www.9499.net/page1.htms=s.replace(/(.*\/){0,}([^\.]+).*/ig,$2)alert(s)
利用正则表达式限制网页表单里的文本框输入内容:
用正则表达式限制只能输入中文:onkeyup=value=value.replace(/[^\u4E00-\u9FA5]/g,'')onbeforepaste=clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))
用正则表达式限制只能输入全角字符:onkeyup=value=value.replace(/[^\uFF00-\uFFFF]/g,'')onbeforepaste=clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))
用正则表达式限制只能输入数字:onkeyup=value=value.replace(/[^\d]/g,'')onbeforepaste=clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))
订阅:
博文评论 (Atom)
0 评论:
发表评论