2012-12-12 131 views
1

我有一个手动编辑的xml文件。 xml文件结构如下:这将是什么正则表达式?

<order> 
    <id>1</field> 
    <current_execution_status>REGENERATED</field> 
    <generated_time>2012-12-01 17:55:00</field> 
    <generation_status>UNKNOWN</field> 
    <priority>0</field> 
    <type>NORMAL</field> 
    <assigned_vehicle>1</field> 
    <assigned_drop_location>1</field> 
    <assigned_pick_location>1</field> 
    <generation_by_user_name>ABC</field> 
    <material>1</field> 
    <order_cancel_detail /> 
    <order_drop_detail /> 
    <order_pick_detail /> 
</order> 

我想与各自的“字段名”取代的field每次出现时从值的前面。对于例如<id>1</field>应该像这样变成<id>1</id>,<current_execution_status>REGENERATED</current_execution_status>等。但没有得到什么应该是我的正则表达式在vim

回答

4
:%s/<\([^<>]*\)>\([^<>]*\)<\/field>/<\1>\2<\/\1>/ 
+0

+1,因为这麻烦我的草率版本没有('[^ <>] *') – Faiz

+0

@Didier:是的,它的工作。但是这花费的时间比@Faiz提供的要多。我认为它只是因为'([^ <>] * \)',如果我理解正确的话。纠正我,如果我错了。 – srahul07

+1

双方工作; @Didier的建议更“严格”,因为它与XML更适合匹配:'/ <.*> /'与'/ <[^<>] *> /'相比有点松散,但对于您的情况,它不会生成任何根本不同。我为迪迪埃+1了,因为在编写正则表达式时,尽可能精确地写出一个好习惯。但是当然,当你只是想快速在'vim'中做点什么来节省几分钟,谁在乎呢? :-) – Faiz

2

如何:

:%s/<\(.*\)>\(.*\)<\/field>$/<\1>\2<\/\1>/ 

这里需要注意Vim的正则表达式:

  1. 捕获/分组与\(而发生 ')' 而不是 '(' ')'。 ('(',')')仅仅意味着 实际字符的开放/关闭的parens。
  2. 捕捉记忆是\1\2
  3. /需要进行转义像往常一样\/
+0

谢谢...那个...工作要命的正则表达式。我想我需要更多地了解正则表达式,特别是vim。 – srahul07

+1

@ srahul07 - 逃逸可能会变得乏味......这[post](http://stackoverflow.com/questions/7400743/create-a-mapping-for-vims-command-line-that-escapes-the-contents-注册)有一个很好的解决方案,这将有所帮助。将该字段放到一个寄存器中,然后在命令模式下,可以使用C-X将该寄存器的转义版本放入命令行。这有点像C-R。 – darcyparker