2017-03-27 80 views
1

我只是試圖用re2來替換文件中的正則表達式,測試通過了一個簡單的字符串。OCaml re2多行字符串

# module Re2 = Re2.Std.Re2;; 
# let re = Re2.create_exn "<key>Tags.*<\\/array>" ;; 
# let orig = "abc <key>Tags</key><array><string>OCaml</string></array> end";; 
# Re2.replace_exn ~f:(fun _ -> "<key>Tags</key><array/>") re orig;; 
- : string = "abc <key>Tags</key><array/> end" 

然而,當我把內容放入文件ss.xml

<key>Starred</key> 
<false/> 
<key>Tags</key> 
<array> 
    <string>Think</string> 
    <string>Performance Test</string> 
    <string>Racket</string> 
    <string>OCaml</string> 
</array> 
<key>Time Zone</key> 
<string>Asia/Shanghai</string> 

OCaml的源代碼:

open Core.Std 
open Async.Std 

module Re2 = Re2.Std.Re2 

let trans_reg (input: string) : string = 
    let re = Re2.create_exn "<key>Tags.*<\\/array>" in 
    let target = "<key>Tags</key><array/>" in 
    Re2.replace_exn ~f:(fun _ -> target) re input 

let handle_file (filename: string) = 
    let%bind text = Reader.file_contents filename in 
    Writer.save (filename^".xml") ~contents:(trans_reg text) 

let() = 
    Command.(run (async ~summary:"" Spec.empty (fun _ -> handle_file "ss.xml"))) 

沒有在我的新文件ss.xml.xml不會改變。

我想知道:

  1. 如何在這種情況下,正則表達式匹配。
  2. 我們什麼時候應該使用參數replaceMatch.t in ~f:(Match.t -> string)? ()

回答

2

Re2有一個選項dot_nl,它控制.是否匹配\n。默認情況下,dot_nl爲false。您可以設置它真正的或者使用該標誌的語法(?s)<key>Tag.*<\\/array>作爲記錄here或OCaml中通過調用

Re2.create ~options:[ `Dot_nl true ] 

我不相信m標誌是與此有關,因爲m控制^$解釋。您的模式不使用^$

此外,強制性警告:You cannot parse XML with regex

+0

謝謝,你幫了我很多。我只是想修改DayOne日記的數據,xml格式很簡單,正則表達式在這種情況下工作。 – liweijian

0

Re2默認情況下一行一行地匹配您的正則表達式,這就是您的表達式從未匹配的原因。

The documention提到了用於多行匹配的m標誌。我不知道JaneStreet對re2的綁定是否可以讓你設置這樣一個標誌,但這絕對是你在這裏尋找的。

我會留意的,我會更新我的答案,我發現一些有用的東西。