闲耘.博客

巨人归来。

之前在网上收集到一个正则表达式拼接的方法/函数,一直没有注意,直到昨天用jsdoc生成api文档时才看到。心里想这样的方法实际应用中大概没什么意义,但是出于好奇就拿出来玩了一下,这一玩不要紧啊,这么精炼的东西差点成垃圾。
 

可能是网络编辑器的原因,原始代码有bug,经过修正和测试,现在的代码如下:代码I

/**
 * 连接两个正则表达式。
 * 题外话:获得字符串常量""的长度,比构建空数组再求其长度效率高(忽略构建过程,求长度消耗时间相同)。
 * @param {RegExp} r 指定被连接的正则表达式对象。
 * @param {String} p 连接后的表达式使用的选项,由"i","g","m"组合而成。
 * @return {RegExp} 返回连接后的正则表达式。
 */

RegExp.prototype.concat = function(r, p){
    var i=(this.source.match(/((?!?:)/g)||"").length; // 正向预搜索。
    return new RegExp(this.source+r.source.replace(/\(d)/g, function($0, $1){
        return "\" + (i+($1|0)); // 修正第二个表达式中的反向引用。注意这里的位运算。
    }), p);
};

原方法名是contact,现在为了和字符串类的一致,换为concat,至于bug/不足这里不做解读。

这个实际应用意义不大的小程式却有值得称道的几点:

1. 正向预搜索匹配第一个表达式里左括号(不包括非捕获组(?:))的个数。

2. 当第一个表达式没有匹配时返回0长度对象(再求其长度),可以构建空数组([])和空字符串(”"),这里使用空字符串,理由下面再解释。
3. 修正反向引用时用的位运算(|),这里将匹配到的数值字符串与0位或没有其他意义,只是将数值字符串转型为数值,相当于parseInt()函数。

下面介绍为什么使用空字符串而不是空数组构建0长度对象。代码II

var I = 10000;

var d = new Date();
for (var i=0; i<I; i++){
   "".length;
}
d = new Date()-d;

var d2 = new Date();
for (var i=0; i<I; i++){
    [].length;
}
d2 = new Date()-d2;

document.write(d+":"+d2);

一万次循环叠加可以发现构建空字符串比构建空数组求长度快1到3倍。
再将代码改为:代码III

var I = 10000;
var s="";
var d = new Date();
for (var i=0; i<I; i++){
    s.length;
}
d = new Date()-d;

var a=[];
var d2 = new Date();
for (var i=0; i<I; i++){
    a.length;
}
d2 = new Date()-d2;

document.write(d+":"+d2);
可以发现,求空字符串长度与空数组长度的过程效率相当。可见,代码II处空数组效率多余的消耗主要在构建空数组对象上。

昨天收到的神奇邮件令我诧异不止,不想今天又收到一封更为神奇的邮件,它的来源是我自己的邮箱地址,却不是我发给自己的:

同样,它被放在了垃圾收件箱,同样打上了警告标语“Warning: This message may not be from whom it claims to be. Beware of following any links in it or of providing the sender with any personal information. Learn more

邮件的内容为空,而标题则是RE…。你哪怕发给我一些广告也好啊,我想,现在这样让我怎么给你的身份定位呢?

你可能怀疑这是我发给自己的作秀邮件,但是我的邮件都会带上个性签名。而且我也尝试过,Gmail不会将发给自己的邮件当作垃圾邮件,也不会打上警告标语。

今天收到一封来自google.com域的垃圾邮件,如图:

当然,这个邮件地址是虚假的,它被Gmail自动放在了Spam里。邮件地址下面的红色警戒条上写着“Warning: This message may not be from whom it claims to be. Beware of following any links in it or of providing the sender with any personal information. Learn more

这种虚假的邮件地址来源很常见,而且我还收到一些邮件地址不合法的邮件,甚至还收到收件人不是我的灵异邮件。

但是,纵然这封邮件的地址很假,纵然这封邮件被放在了垃圾邮件箱,纵然这封邮件本身也是广告内容,我在这里还是要提一下这封邮件本身,他是一封公益广告邮件,内容是拯救西北的沙化,绿化西北,防止沙尘暴。

下面是引用原文:

用您善良的心灵,请友善的点击一下吧!Http://www.net114.com/green/拯救地址,携手绿色西北行动用我们的 爱心我们的 责任我们的 双手
支持 绿 西北行动让沙尘暴不再肆虐 让 绿色 驱赶贫困让我们传递这个共同的责任!请友善的点击一下吧!Http://www.net114.com/green/

拷贝过来的文本已经失去了原文的格式,这里不做调整。

我看过文中提到的地址,下面发一些里面的牛图:

中国许多地区被沙化。

肆虐的沙尘暴。

Route
控制网络路由表。该命令只有在安装了 TCP/IP 协议后才可以使用。

route [-f] [-p] [command [destination] [mask subnetmask] [gateway] [metric costmetric]]

参数

-f
清除所有网关入口的路由表。如果该参数与某个命令组合使用,路由表将在运行命令前清除。

-p
该参数与 add 命令一起使用时,将使路由在系统引导程序之间持久存在。默认情况下,系统重新启动时不保留路由。与 print 命令一起使用时,显示已注册的持久路由列表。忽略其他所有总是影响相应持久路由的命令。

command
指定下列的一个命令。

命令 目的
print 打印路由
add 添加路由
delete 删除路由
change 更改现存路由

destination
指定发送 command 的计算机。

mask subnetmask
指定与该路由条目关联的子网掩码。如果没有指定,将使用 255.255.255.255

gateway
指定网关。

名为 Networks 的网络数据库文件和名为 Hosts 的计算机名数据库文件中均引用全部 destination 或 gateway 使用的符号名称。如果命令是 print 或 delete,目标和网关还可以使用通配符,也可以省略网关参数。

metric costmetric
指派整数跃点数(从 1 到 9999)在计算最快速、最可靠和(或)最便宜的路由时使用。

route命令范例

route print
要显示 IP 路由表中以 10. 开始的路由,请键入:
route print 10.*

要添加默认网关地址为 192.168.12.1 的默认路由,请键入:
route add 0.0.0.0 mask 0.0.0.0 192.168.12.1

要添加目标为 10.41.0.0,子网掩码为 255.255.0.0,下一个跃点地址为 10.27.0.1 的路由,请键入:
route add 10.41.0.0 mask 255.255.0.0 10.27.0.1

要添加目标为 10.41.0.0,子网掩码为 255.255.0.0,下一个跃点地址为 10.27.0.1 的永久路由,请键入:
route -p add 10.41.0.0 mask 255.255.0.0 10.27.0.1

要添加目标为 10.41.0.0,子网掩码为 255.255.0.0,下一个跃点地址为 10.27.0.1,跃点数为 7 的路由,请键入:
route add 10.41.0.0 mask 255.255.0.0 10.27.0.1 metric 7

要添加目标为 10.41.0.0,子网掩码为 255.255.0.0,下一个跃点地址为 10.27.0.1,接口索引为 0×3 的路由,请键入:
route add 10.41.0.0 mask 255.255.0.0 10.27.0.1 if 0×3

要删除目标为 10.41.0.0,子网掩码为 255.255.0.0 的路由,请键入:
route delete 10.41.0.0 mask 255.255.0.0

要删除 IP 路由表中以 10. 开始的所有路由,请键入:
route delete 10.*

要将目标为 10.41.0.0,子网掩码为 255.255.0.0 的路由的下一个跃点地址由 10.27.0.1 更改为 10.27.0.25,请键入:
route change 10.41.0.0 mask 255.255.0.0 10.27.0.25