2015年5月25日

Javascript正则表达式笔记

由于最近项目需要从字符串中提取字串,具体地说是匹配实数集R(严格的说是有理数集Q)中的元素。网上找了一圈没一个能用的,不知道是不是我使用正则表达式的方法有问题。而且网上似乎转来转去的都是那么几篇文章,无奈只能自己来写。

由于不能预见字串会有几位小数,正负也不一定,所以下面的正则表达式匹配的是一切实数(严格的说是有理数):

var str1 = "transform(-332.44,567)";
var str2 = "transform(0,-42)";

var regExp = str1.match("/0|-?\d+[.]?\d+/g");     // regExp=[-332.44, 567]
regExp = str2.match("/0|-?\d+[.]?\d+/g");       // regExp=[0, -42]

看到几乎所有的文章都只记录了表达式,而没有告诉读者表达式是如何写出来的,读者往往只能知其然而不知其所以然。这里再说一下这个正则表达式书写的过程。其实只要根据实数(严格的说是有理数)的判据就容易得到:

  • 0
  • 可能有一个负号(负数),或者没有(正数)
  • 可能有一个小数点(小数),或者没有(整数)

所以,表达式中,第一部分将0提出来,单独作为一个可能即“0|”;第二部分,即整数部分,为1~n位数字,即”[0-9]{1,}“,可简写为“[0-9]+”,进而继续简写为“\d+”;第三部分,即小数点,可能存在也可能不存在,故写为“[.]?”;小数部分同整数部分;最后,再加上js的正则表达式搜索指令g表示是一个贪心模式,即可匹配出全部的数字。

2015年3月1日

浅尝油猴脚本

好久不写博客,以前Blogger上配置的CSS都忘了是哪些了,想了半天才记起来≶p>里的内容有首行缩进。由于种种原因,翻墙是越来越难了,这也给我偷懒带来了理由。上网的时候经常会遇到一些不便,比如:该帖子回复后可见、下载链接缺头少尾等等。于是产生了改造网页的想法。先后尝试了Chrome插件和油猴脚本,最终还是觉得油猴脚本更适合干这活儿——简单、直接。目前写了两个简单的脚本,一个用来解决回复后可见,一个用来搞定下载链接的。我将逐一解释其应用场景。

2014年8月9日

秦时明月,何时可掇

下午去电影院看了《秦时明月之龙腾万里》。我并不是该系列的爱好者,此前也从未涉猎过该系列任何形式的作品。看这部电影是应高中同学的邀请,本着“不看电影也可以见见同学”的心情走进电影院的。从《秦时明月》整个系列的评价以及本次观影的感受来说,这部影片在国内动画市场堪称翘楚,但也只能是关上门在国内玩,跟美式3D动画或是日式剧场版动画还有相当差距。

2014年6月24日

其来有自的音乐库(10)

差不多2个月没写博客了,明天又有一门很难的考试,今天却没心思复习,来填坑吧。

2014年4月20日

其来有自的音乐库(9)

又到了批量结课、交论文的时节,目前暂时只有一篇论文有头绪。

2014年4月14日

CC2530 2.5.1a 协议栈研究笔记(1) —— LED及按键驱动修改

ZStack协议栈为CC2530编写了一套操作系统并规定了数据收发的协议。这个片上系统工作的大致流程是:初始化各种板上硬件资源(LED、按键、串口、其他外设),初始化网络状态,根据设备类型进行组网或加入网络,最后正式开始运行这个系统——进入一个死循环不断轮询各种片上资源和设备,一旦其状态有所改变即在事件处理过程中执行相应的事件回调函数。

2014年4月8日

CC2530开发板基础实验(5)—— JoyStick

CC2530上有一个5向(上\下\左\右\中心)摇杆(Joystick)。而5个方向的输入并不是靠5个独立的IO口,而是用ADC采集P0_6口的电压值来判断的。这样做的好处是可以节省4个IO口。对摇杆的方向采集同样有轮询和中断两种方式,在ZigBee协议栈中使用的是轮询方式。我在试过两种方式后发现采用中断的效果并不好,想必这也是TI在协议栈中使用轮询的原因。这个问题先不展开,先来看看如何采集摇杆的方向。

2014年3月29日

CC2530基础实验(4) —— UART及温度传感器

UART是串口的一种异步通信方式(同步方式为SPI)。CC2530有UART0和UART1两个端口可用于串口通信,两个端口功能完全相同,可独立工作。

2014年3月22日

CC2530基础实验(3)—— 定时器

CC2530上共有T1~T4,4个定时器,另外还有诸如系统定时器、睡眠定时器、看门狗定时器等等。在不同的电源模式下可以使用不同速率的振荡器。晶振的精度高、能耗高、启动慢;RC振荡器的精度更低一些,能耗低,启动快。需要注意的是在射频传输时必须使用32M的晶振,而在要求低功耗又对精度要求不高的场景下可以使用RC振荡器。默认情况下,使用Active / Idel模式,32M晶振,振荡器速率为16M。

2014年3月20日

CC2530开发板基础实验(2)—— 按键的轮询及中断

我的开发板上只有一个按键S2和一个5向Joystick。Joystick涉及到ADC,暂时不去弄了。对于按键的处理可以采用两种方式:轮询和中断。轮询是一种低效的方式,CPU不断的访问每一个可能产生输入信号的管脚,如果有信号输入,那就做出相应的处理,否则访问下一个输入管脚。而中断方式则类似于C#里的事件绑定、Java里的观察者模式,当输入管脚、时钟等产生一个中断信号,CPU会中止当前正在处理的事务,转去执行中断源的程序。待处理完中断再继续之前中止的事务。这里我用的是“类似”,即它并不是一种多线程模式,如果在执行中断源的响应程序的过程中,又有新的中断,那么后产生中断会等待当前中断源的响应程序执行完毕才会执行。这个等待队列也是有限的,似乎只能容纳一个等待的中断源。