博主资料

留言 加为好友 收藏

用户名:  lingoosoft
来自:  北京 海淀
年龄:  27

个人统计

用户名: lingoosoft
等级: 初来乍到
威望: 230
积分: 818
在线时间: 28 小时
日志总数: 88
评论数量: 134
访问次数: 312828
建立时间: 2006-09-30
RSS订阅       手机访问

文章搜索

文章列表

友情链接

最近访问的人:

冬眠的水草世界
2008-08-20 12:14:30
拼命三郎
2008-08-05 14:50:59
aklsdf
2008-07-31 15:56:11
剑南游侠儿
2008-07-29 21:35:33
ccimanic
2008-07-18 11:47:54
IT长空
2008-07-08 11:35:08
电子商务研究(B2C)
2008-07-03 13:55:59
∽★@_@★∽
2008-06-18 14:22:47
在路上
2008-06-18 02:17:02
☆°卢京乀°
2008-06-15 16:12:51

日志文章

2006年12月14日 10:21:14

javascript正则不完全精简说明

简单的说,正则表达式是一种可以用于模式“匹配”和“替换”的强有力的工具。

语法格式:以字符“/”开始和结束,其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。

元字符:所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
“+”规定其前导字符必须在目标对象中连续出现一次或多次。
“*”规定其前导字符必须在目标对象中出现零次或连续多次。
“?”规定其前导对象必须在目标对象中连续出现零次或一次。
“\s”用于匹配单个空格符,包括tab键和换行符;  
“\S”用于匹配除单个空格符之外的所有字符;  
“\d”用于匹配从0到9的数字;
“\D”匹配一个非数字字符。等价于 [^0-9];
“\w”用于匹配字母,数字或下划线字符;  
“\W”用于匹配所有与\w不匹配的字符;  
“\f”匹配一个换页符。等价于 \x0c 和 \cL;
“\n”匹配一个换行符。等价于 \x0a 和 \cJ;
“\r”匹配一个回车符。等价于 \x0d 和 \cM;
“\t”匹配一个制表符。等价于 \x09 和 \cI;
“\v”匹配一个垂直制表符。等价于 \x0b 和 \cK;
“.”用于匹配除换行符之外的所有字符;
“\cx”匹配由x指明的控制字符。例如,\cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。


限定符:这些限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
{n} n 是一个非负整数。匹配确定的 n 次。
{n,} n 是一个非负整数。至少匹配 n 次。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。请注意在逗号和两个数之间不能有空格。

“?”当该字符紧跟在任何一个其他限制符(*, +, ?, {n}, {n,}, {n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。

定位符:定位符用于规定匹配模式在目标对象中的出现位置。
“^”定位符规定匹配模式必须出现在目标字符串的开头。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
“$”定位符规定匹配模式必须出现在目标对象的结尾。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
“\b”定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一  
“\B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。

正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。
/[A-Z]/  上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。  
/[a-z]/  上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。  
/[0-9]/   上述正则表达式将会与从0到9范围内任何一个数字相匹配。  
/([a-z][A-Z][0-9])+/ 上述正则表达式将会与任何由字母和数字组成的字符串,如“aB0”等相匹配,“abc”不匹配。
“()”符号包含的内容必须同时出现在目标对象中。

在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符“|”。

否定符“[^]”:否定符“[^]”规定目标对象中不能存在模式中所规定的字符串。一般来说,当“^”出现在“[]”内时就被视做否定运算符;而当“^”位于“[]”之外,或没有“[]”时,则应当被视做定位符。

转义符“\”:原样匹配“\”之后的字符。

在构造正则表达式之后,就可以象数学表达式一样来求值,也就是说,可以从左至右并按照一个优先级顺序来求值。优先级如下:
1.\ 转义符  
2.(), (?:), (?=), [] 圆括号和方括号  
3.*, +, ?, {n}, {n,}, {n,m} 限定符  
4.^, $, \anymetacharacter 位置和顺序  
5.|“或”操作


RegExp()对象中的test()方法可以检验目标对象中是否包含匹配模式,并相应的返回true或false。
var pattern = /\d/;
pattern.test("123");


正则表达式模式以及应用模式的标志:
语法1:re = /pattern/[flags]  
语法2:re = new RegExp("pattern",["flags"])
参数:
re
必选项。将要赋值为正则表达式模式的变量名。
Pattern
必选项。要使用的正则表达式模式。如果使用语法1,用 "/" 字符分隔模式。如果用语法2,用引号将模式引起来。
Flags
可选项。如果使用语法2 要用引号将flag引起来。标志可以组合使用,可用的有:
g (全文查找出现的所有 pattern)  
i (忽略大小写)  
m (多行查找)


RegExp()对象中的方法:
用正则表达式模式在字符串中运行查找,并返回包含该查找结果的一个数组。rgExp.exec(str)
返回一个 Boolean 值,它指出在被查找的字符串中是否存在模式。rgexp.test(str)
使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回。stringObj.match(rgExp)
返回与正则表达式查找内容匹配的第一个子字符串的位置。stringObj.search(rgExp)


常用列表:
/^\[ \t]*$/ 匹配空白行。
/<(.*)>.*<\/\1>/ 匹配HTML标记
/<(.*)>.*<\/\1>|<(.*) \/>/ 匹配HTML标记
/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/ 匹配email地址
/^[a-zA-Z]+:\/\/(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\S*)(\?\S*)?$/ 匹配url
/^[0-9.]{1,20}$/ 匹配IP地址
/^[a-zA-Z0-9 ]{3,12}$/ 匹配邮政编码
/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/ 匹配手机号
/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/ 匹配普通电话
/[\u4e00-\u9fa5]/ 匹配中文字符
/[^\x00-\xff]/ 匹配双字节字符(包括汉字在内)
/\n[\s| ]*\r/ 匹配空行
/(^\s*)|(\s*$)/ 匹配首尾空格的正则表达式
/^(\d{15}|\d{18})$/ 身份证
/^\d{7}$/ 军人证
/^\S*((\d+\S*[a-zA-Z]+)|([a-zA-Z]+\S*\d+))\S*$/ 由可见字符,且最少由一个英文字母和一个数字组成的字符串

/^(-?\d+)(\.\d+)?$/ 匹配浮点数
/^\d+$/ 匹配非负整数(正整数 + 0)  
/^[0-9]*[1-9][0-9]*$/ 匹配正整数  
/^((-\d+)|(0+))$/ 匹配非正整数(负整数 + 0)  
/^-[0-9]*[1-9][0-9]*$/ 匹配负整数  
/^-?\d+$/ 匹配整数  
/^\d+(\.\d+)?$/ 匹配非负浮点数(正浮点数 + 0)  
/^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$/ 匹配正浮点数
/^((-\d+(\.\d+)?)|(0+(\.0+)?))$/ 匹配非正浮点数(负浮点数 + 0)
/^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/ 匹配负浮点数

计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}

javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:
String.prototype.trim = function() {
return this.replace(/(^\s*)|(\s*$)/g, "");
}

利用正则表达式分解和转换IP地址:
下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:
function IP2V(ip) {
re = /(\d+)\.(\d+)\.(\d+)\.(\d+)/g; // 匹配IP地址的正则表达式
if (re.test(ip)) {
  return RegExp.$1*Math.pow(255,3)) + RegExp.$2*Math.pow(255,2))+RegExp.$3*255 + RegExp.$4*1;
} else {
  throw new Error("Not a valid IP address!");
}
}

上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:
var ip = "10.100.20.168";
ip = ip.split(".");
alert("IP值是:" + (ip[0]*255*255*255 + ip[1]*255*255 + ip[2]*255 + ip[3]*1));

用正则表达式从URL地址中提取文件名的javascript程序,如下结果为page1
s = "http://www.9499.net/page1.htm";
s = s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2");

利用正则表达式限制网页表单里的文本框输入内容:
用正则表达式限制不能输入中文:
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,''))"

用正则表达式限制只能输入数字和英文:
onkeyup="value=value.replace(/[\W]/g,'') "
onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

利用正则表达式去除字串中重复的字符的算法程序:
var s="abacabefgeeii"
var s1=s.replace(/(.).*\1/g,"$1")
var re=new RegExp("["+s1+"]","g")
var s2=s.replace(re,"")
alert(s1+s2) //结果为:abcefgi
思路是使用后向引用取出包括重复的字符,再以重复的字符建立第二个表达式,取到不重复的字符,两者串连。这个方法对于字符顺序有要求的字符串可能不适用。

类别: Javascript |  评论(0) |  浏览(2578) |  收藏
发表评论