javascript获取正则中的子匹配

2009年06月04日 | 353 次浏览 | JavaScript | 2条评论  

昨天帮朋友处理一段文本正好用到了这个,记录一下。

  1. var str = '<a href="http://google.com" target="_blank">google</a>123<a title="百度" href="http://baidu.com">baidu</a>abce<a href="http://msn.com" class="msn">msn</a>kkk';
  2. var reg = /<a.*?href="([^"]*)"[^>]*>([^<]*)<\/a>/i; // *? 非贪婪匹配
  3. var arr = [];
  4. while(reg.exec(str)){
  5.     arr.push({'link':RegExp.$1 , 'text':RegExp.$2});
  6.     str = RegExp.rightContext;//将str截断
  7.     reg.lastIndex = 0;//重置下次匹配开始的位置
  8. }
  9. console.info(arr);

另外两种正则表达式语法有一些不同,比如说转义。

  1. #正则表达式语法 1
  2. re = /pattern/[flags]
  3. #正则表达式语法 2
  4. re = new RegExp("pattern",["flags"])
  5.  
  6. #比如说要匹配"潘魏增(panweizeng)",同时获取其中的子匹配panweizeng,对应的写法如下
  7. var reg = /[^\(]+\(([^\)]+)\)/g;
  8. #这里需要对括号使用两个转义符号\
  9. var reg = new RegExp("[^\\(]+\\(([^\\)]+)\\)", "g");
  10. var submatch;
  11. if(reg.exec(str)){
  12.    submatch = RegExp.$1;
  13.    reg.lastIndex = 0;
  14. }
  15. console.info(submatch);

买了件犀牛文化衫

2009年03月26日 | 409 次浏览 | 动态 | 1条评论  

china-pub.com买了一件犀牛T恤,准备迎接夏天。

What's New On JavaScript

SVN分支和合并的简单例子

2009年03月08日 | 541 次浏览 | 学习 | 3条评论  

尽管svn没有作强制要求,但是一般svn版本库目录建议创建trunk、branches和tags三个目录。 在实际操作时,trunk主干版本要时刻保持干净,即随时可以基于这个版本进行修改并将应用部署上线。branches是分支目录,存放并行开发的项目代码,因为分支是主干的廉价拷贝(相当只是提交了一次主干版本,增加了一个版本号,并没有取出版本库作镜像拷贝),所以你可以放心建立很多分支版本。不过Subversion不支持跨版本库的拷贝,当使用svn copy时你只能在同一个版本库内操作。tags目录存放trunk某个的快照,比如说release-1.0即trunk处于1.0版本时的快照。

使用svn来作团队的代码管理,那么分支和合并将是非常常用的操作。下面是一个简单的示例。

1. 创建分支。这里假设你要负责一个叫theme的项目,分支号1.7.2。

  1. #这里的localhost是svn服务器地址
  2. svn copy -m "1.7.2 - theme" svn://localhost/www/trunk svn://localhost/www/branches/branch1.7.2-theme
  3. svn co svn://localhost/www/branches/branch1.7.2-theme

2. 从trunk中merge到分支。忙了一个星期终于开发完了,但是开发期间trunk版本有过改动,部署上线前你需要合并trunk的代码。

  1. #branch1.7.2-theme是分支目录,注意不可以进到分支子目录
  2. cd branch1.7.2-theme
  3. #前面的12972是开分支之前trunk的版本号,后面的12991是merge时trunk的版本号
  4. svn merge -r 12972:12991 svn://localhost/www/trunk

如果有冲突选择p(postpone),merge完了之后使用svn st|grep ^C查看冲突文件,然后比对修改冲突文件。解决冲突后再check in ,信息写上执行的merge操作。

  1. svn ci -m 'svn merge -r 12972:12991 svn://localhost/www/trunk'

3. 从分支merge到trunk。上线测试完毕,你很幸运,一切都如预期正常,这时就要将分支回归trunk,将trunk更新到最新。

  1. #先从trunk checkout一份新鲜的代码,然后cd到该版本目录下
  2. svn co svn://localhost/www/trunk
  3. cd trunk
  4. #12973是分支开始的版本号,13006是分支结束的版本号
  5. svn merge -r 12973:13006 svn://localhost/www/branches/branch1.7.2-theme

如步骤2一样解决冲突,解决冲突后再check in,信息写上执行的merge操作。

  1. svn ci -m "svn merge -r 12973:13006 svn://localhost/www/branches/branch1.7.2-theme"

相关的手册可以参阅svn文档,电子版可以到这里下载

Devtodo–linux下的todolist软件

2009年02月27日 | 573 次浏览 | 学习 | 2条评论  

Devtodo是一个命令行todolist管理工具,相关介绍可以看linuxtoy的《Dev Todo: 从命令行管理待做事项清单》。

paoe同学提醒下,ubuntu下可以直接apt-get install devtodo来安装,非常方便。如果你在用bash,那么下面这个函数可能对你会很有用。把它加到.bashrc文件中,每次cd进入目录的时候,如果该目录下有.todo文件就会把todolist打印出来。

  1. #此函数得到某大牛指点,在此表示感谢
  2. cd() {
  3.     if [[ $# == 0 ]]; then
  4.         command cd
  5.     else
  6.         command cd "$*"
  7.     fi 
  8.     if [ -f .todo ]; then
  9.         todo
  10.     fi 
  11. }

另外如果你用 zsh 的话,可以把这段加入 ~/.zshrc

  1. #由网友vern提供,我没有测试过
  2. cd() {
  3. if builtin cd$@”; then
  4. if [ -f `which devtodo` ]; then devtodo -s; fi
  5. fi
  6. }

Devtodo的一大缺点就是不能在多个机器间同步,以我为例,每天都在开发机、工作机和笔记本之间切换,如果想使用Devtodo,当然最好考虑在多个机器上都能使用相同的、最新的一份todolist拷贝,而Devtodo默认是没有的,你得自己想解决方案。所以我想todolist软件跟线上服务集成才是更好的方向,其他很多类型的软件也一样,比如说笔记记录、日程安排等。

sed和awk的简单使用

2009年04月07日 | 459 次浏览 | 学习  

平时都用ubuntu,所以处理问题的时候经常都是想到linux下提供的程序。sed和awk是其中两个很强大的工具,用它们来作查找和替换非常方便。

以下是我最近使用过的几个实际例子

  1. #使用脚本中的$VERSION变量替换{VERSION}字串,注意这里得使用双引号
  2. sed -i "s/{VERSION}/$VERSION/g" $UPDATE_FILE
  3. #去掉含有updateKey的行
  4. sed -i "s/.*updateKey.*//" install.rdf
  5. #替换含有js/core.js?v=1234为<?php HtmlHelper::getJS('\1'); ?>
  6. #这里正则中的.不用转义,但是(、)、+都需要转
  7. #后面引用前面正则的子匹配使用\1、\2、……
  8. sed -i "s/.*js\/\(\w\+\).js?v=.*/<?php HtmlHelper::getJS('\1'); ?>/g" *
  9.  
  10. #获得$XPIFILE文件的hash
  11. HASH=`sha1sum $XPIFILE |awk '{print $1}'`
  12. #从<em:version>0.1.3</em:version>中获得当前版本号
  13. VERSION=`awk '/(<em:version>([^<]*)<\/em:version>)/' install.rdf |awk -F '>' '{print $2}'|awk -F '<' '{print $1}'`

批量替换以后,如果你使用svn,还可以配合vim来复查替换的结果。我常用的做法是

  1. xp@xp-notebook:www$ svn di > ~/diff
  2. xp@xp-notebook:www$ vim ~/diff

这样可以获得vim的语法高亮,如果能再配合mark插件,那就非常完美了。

以前在windows中经常使用dreamweaver来作查找替换,但是和linux的工具(grep/sed/awk)相比,速度和效率上就差了很多。

更新几个例子
1.找到并删除匹配的行

  1. #这里找到含有google统计脚本的行并删掉。/<script src=".*urchin.js".*>$/是匹配的正则表达式,d是执行的命令。
  2. sed -i '/<script src=".*urchin.js".*>$/d' filename

2.删除找到匹配行的下一行

  1. #删除包含页脚后面的</div>。这里的n表示往下读下一行。
  2. sed -i "/<?php include_once( 'footer.php' ); ?>/{ n; /<\/div>$/d;}" filename

3.多行匹配和引号转义

  1. #找到header区块并替换为<?php include_once( 'header.php' ); ?>。
  2. #:begin 是设定一个begin标记,每个分号代表一个语句结束
  3. #/<div id=\"header\">/,/<\/div>$/    reg1,reg2  两个正则表达式限定查找的范围,大括号内为执行的命令。
  4. # /<\/div>$/! 非最后匹配行,$!表示非文件最后一行, N表示追加下一行到缓冲区,b begin是跳到begin开始,如此循环直到header区块都在缓冲区。
  5. #然后执行s/<div id=\"header\">.*logo.*<\/div>/<?php include_once( 'header.php' ); ?>/; 替换
  6. sed -i ":begin; /<div id=\"header\">/,/<\/div>$/ { /<\/div>$/! { $! { N; b begin }; }; s/<div id=\"header\">.*logo.*<\/div>/<?php include_once( 'header.php' ); ?>/;     };" filename

参考
用sed替换跨行内容
关于sed的小发现

Firefox插件开发

2009年03月27日 | 1,047 次浏览 | JavaScript, 学习 | 7条评论  

YUI实现的Tab切换

2009年02月15日 | 752 次浏览 | JavaScript | 4条评论  

Bespin: 开放式web开发平台

2009年02月15日 | 468 次浏览 | JavaScript  

前端工程师的救命稻草

2009年02月13日 | 519 次浏览 | CSS, JavaScript, 学习  

使用vim的一些tip

2009年03月01日 | 565 次浏览 | 学习  

高峰体验

2009年02月11日 | 334 次浏览 | 学习  

使用vim来编写javascript代码

2009年02月11日 | 1,537 次浏览 | 学习 | 3条评论  

基于YUI的封装开发

2009年02月03日 | 595 次浏览 | JavaScript | 1条评论  

javascript变量作用域的几个例子

2009年02月03日 | 713 次浏览 | JavaScript | 1条评论  

春节回家流水账

2009年02月02日 | 466 次浏览 | 动态 | 1条评论  

更多文章

最受欢迎

评论最多