多行字符串上的 OCaml re2
OCaml re2 on multi-line string
我只是尝试使用 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
。
我在想:
- 在这种情况下如何进行正则表达式匹配。
- 什么时候用
~f:(Match.t -> string)
replaceMatch.t
的参数? ()
默认情况下,Re2 逐行匹配您的正则表达式,这就是您的表达式从不匹配的原因。
The documention 提到了用于多行匹配的 m
标志。我不知道 JaneStreet 对 re2 的绑定是否允许您设置这样的标志,但这绝对是您在这里寻找的。
我会留意,如果发现有用的内容,我会更新我的答案。
Re2 有一个选项 dot_nl
控制 .
是否匹配 \n
。默认情况下,dot_nl
为假。您可以使用 here 中记录的标志语法 (?s)<key>Tag.*<\/array>
或通过调用
在 OCaml 中将其设置为真
Re2.create ~options:[ `Dot_nl true ]
我不认为 m
标志在这里是相关的,因为 m
控制着 ^
和 $
的解释。您的模式不使用 ^
或 $
.
此外,强制性警告:You cannot parse XML with regex
我只是尝试使用 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
。
我在想:
- 在这种情况下如何进行正则表达式匹配。
- 什么时候用
~f:(Match.t -> string)
replaceMatch.t
的参数? ()
默认情况下,Re2 逐行匹配您的正则表达式,这就是您的表达式从不匹配的原因。
The documention 提到了用于多行匹配的 m
标志。我不知道 JaneStreet 对 re2 的绑定是否允许您设置这样的标志,但这绝对是您在这里寻找的。
我会留意,如果发现有用的内容,我会更新我的答案。
Re2 有一个选项 dot_nl
控制 .
是否匹配 \n
。默认情况下,dot_nl
为假。您可以使用 here 中记录的标志语法 (?s)<key>Tag.*<\/array>
或通过调用
Re2.create ~options:[ `Dot_nl true ]
我不认为 m
标志在这里是相关的,因为 m
控制着 ^
和 $
的解释。您的模式不使用 ^
或 $
.
此外,强制性警告:You cannot parse XML with regex