1

我只是尝试使用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)?()
4

2 回答 2

2

Re2 有一个dot_nl控制是否.匹配的选项\n。默认情况下,dot_nl为假。您可以使用此处(?s)<key>Tag.*<\\/array>记录的标志语法或在 OCaml 中通过调用将其设置为 true

Re2.create ~options:[ `Dot_nl true ]

我不相信m标志在这里是相关的,因为m控制和的^解释$。您的模式不使用^or $

此外,强制性警告:您不能使用正则表达式解析 XML

于 2017-03-28T15:11:29.100 回答
0

Re2 默认逐行匹配你的正则表达式,这就是你的表达式永远不会匹配的原因。

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

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

于 2017-03-28T07:45:43.583 回答