我在电脑上用大量的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进行全局替换.
阅读(1477) | 评论(0) | 转发(0) |