RegExp中的$1...$9属性:
返回在模式匹配期间找到的,所存储的最近9个部分。
每当产生一个带括号的成功匹配时,$1...$9的属性值就会被修改,可以在一个正则表达式中指定任意多个带括号的子匹配,但是最多只能存储9个。
例:
<script type="text/javascript">
var pattern = /(\w+)@(\w+)\.(\w+)/g,
str = "Please send mail to george@contoso.com and someone@example.com. Thanks!",
result = pattern.test(str);
alert(RegExp.$1+"-"+RegExp.$2+"-"+RegExp.$3);
</script>
打印:george-contoso-com。
RegExp.$1匹配第一个带括号的子匹配,打印:george,依次类推,RegExp.$2匹配第二个带括号的子匹配,所以打印:contoso。
然后分析日期格式转换:
如给定要转换的日期格式为"yyy-MM-dd"。
如果我们要获取这个格式的年份,考虑到RegExp.$1的特性,我们可以通过/(y+)/的方式匹配该格式,获取年份的位数,然后截取当前日期的年份信息后替换即可。
如:
<script type="text/javascript">
var pattern = "yyy年",
result = /(y+)/.test(pattern),
year = String(new Date().getFullYear());
pattern = pattern.replace(RegExp.$1,year.substr(4-RegExp.$1.length));
alert(pattern);
</script>
所以,我们可以根据这种方式写出日期转换的代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>
<body>
</body>
<script type="text/javascript">
Date.prototype.format = function(pattern){
if(typeof pattern === "undefined" || pattern === null) {
pattern = "yyyy年MM月dd日 HH时mm分ss秒";
}
var val = {
"M+":this.getMonth() + 1, //月份
"d+":this.getDate(), //日
"H+":this.getHours(), //小时
"m+":this.getMinutes(), //分钟
"s+":this.getSeconds() //秒
};
if(/(y+)/.test(pattern)) {
var year = String(this.getFullYear());
pattern = pattern.replace(RegExp.$1,year.substr(4-RegExp.$1.length));
}
for(var i in val) {
if(new RegExp("("+i+")").test(pattern)) {
//如果只匹配一个值,如果该数<10,那么不加0,否则仍然为两位数,否则如果为2位数,<10则补0
var temp = (RegExp.$1.length === 1)?val[i]:("00"+val[i]).substr(String(val[i]).length);
pattern = pattern.replace(RegExp.$1,temp);
}
}
return pattern;
};
alert(new Date().format("yyy年M月"));
</script>
</html>