2012-12-12 126 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