Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2314818
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: LINUX

2006-07-13 11:58:52

我在电脑上用大量的XML文件来保存平时积累的小技巧, 随手笔记等.
主要的TAG是这样:
 
在对XML知识有限的情况下, 我以为属性的内容既然已经用双引号引起来, 那么其中出现<>这样的称号应该是可以正确解析的, 但实际不是这样, 为了处理的简化, XML标准规定即使在这里也不能有<字符, 虽然>字符是允许的, 但是不提倡.

所以, 我用 < 替换了 原来的<

时间长了, 发现看到大量的< 容易搞乱大脑对字符的处理系统, 最好还是能发挥象形文字的优势, 即字符的形状本身就可以直接驱动大脑中对它的直观解释, 而不是象< 那样先要经由一个知识系统的转化才行.

另外还有一些连续的两个<<是用来表达书名号的, 对应的结束符是>>

怎么把XML属性中的< > << >>替换成汉字字符集中对应的〖〗〈〉符号?

同时, 有一部分文件中的<已经被换成了< >被换成了> 如何连这种也一块处理:

首先, 生成一个字典对照表:
let book= {"<<": '〖', ">>": '〗', '<':'〈', '>':'〉', '<':'〈', '>':'〉' }
放在同一行上可读性不强, 但有个好处: 可以在:命令行上用:exe getline('.')来执行
完全的内容如下:
let book= { "<<"   : '〖',
      \ ">>"       : '〗',
      \ "<"     : '〈',
      \ ">"     : '〉',
      \ "<"        : '〈',
      \ ">"        : '〉',
      \ "<<" : '〖',
      \ ">>" : '〗' }

即: 连续的两个 << 和 << 被替换为 〖
    连续的两个 >> 和 >> 被替换为 〗
而单独的 <和>, < > 分别被替换为〈和〉


下面是可怕的正则表达式:
%s#\%(desc="[^"]*\)\@<=
 \(
     \%(<\)\@     \%(>\)\@     <<\|>>\|
     [<>]\@][<>]\@!\|
     <<\|
     >>
 \)#\=book[ submatch(1) ]#g
为了解读方便, 把它写在多行, 真正用的时候需要把各行连接在一起, 每行开头的空格也要去掉.
* 每个\| 是VIM中对"或"的表达, 在PERL中是|, 不需要\, VIM也可通过set magic达到这一点, 但这不是我的习惯
* \@* \(和\)跟\%(\)不同的地方在于它会把匹配的内容捕获到内部寄存器\1...\9中, 后面的表达式可以进行back reference. 在不进行back reference时 用\%(来代替\(可以节省正则表达式的处理开销
* 整个正则表达式只有一个back reference: 最外层的那个\(...\), 被后面的submatch的参数1 所引用.
* \%(<\)\@<<\%(<\)\@! 是查找这样的<, 它的前后不能是< 理解了这个, 其它几个用\| 分隔的alternates 是一个道理
* \= 结构, 这在VIM正则表达式中是一个强大的功能, 它对后面的表达式求值来动态得到一个要替换的目标串. 这里的表达式是book 这个哈希字典的使用, key就是找到的字符串, 也就是前面赋给book的数据项, 求值的结果是数据项的value部分
* 最后加g进行全局替换.
阅读(1445) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~