多行字符串上的OCaml re2

多行字符串上的OCaml re2,ocaml,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.r

我只是尝试用它来替换文件中的正则表达式,测试通过了一个简单的字符串

# 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"
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")))
opencore.Std
开放异步.Std
模块Re2=Re2.Std.Re2
let trans_reg(输入:string):string=
让re=Re2.create_exn“Tags.*”在
让target=“Tags
Match.t
~f:(Match.t->string)
?()
默认情况下,Re2会逐行匹配正则表达式,这就是表达式从不匹配的原因

提到了一个用于多行匹配的
m
标志。我不知道JaneStreet对re2的绑定是否允许您设置这样的标志,但这肯定是您在这里寻找的


我会留意,如果发现有用的东西,我会更新我的答案。

Re2有一个选项
dot\u nl
,它控制
是否匹配
\n
。默认情况下,
dot\u nl
为false。您可以使用标记语法
(?s)将其设置为true通过调用

Re2.create ~options:[ `Dot_nl true ]
我不认为
m
标志与此相关,因为
m
控制
^
$
的解释。您的模式不使用
^
$


另外,强制性警告:

谢谢,你帮了我很多忙。我只想修改DayOne日志的数据,xml格式很简单,正则表达式在这种情况下有效。
Re2.create ~options:[ `Dot_nl true ]