2017-03-27 10 views
1

그냥 파일의 정규식을 바꿀 때 re2을 사용하려고하면 테스트는 간단한 문자열로 전달됩니다. 내가 ss.xml로 파일에 내용을 넣을 때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" 

그러나 :

<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의 매개 변수를 ~f:(Match.t -> string)에 사용합니까?()

답변

2

Re2는 .\n과 일치하는지 여부를 제어하는 ​​옵션 dot_nl을가집니다. 기본적으로 dot_nl은 false입니다. 당신은 내가 m 플래그가 여기에 관련이 믿지 않는

Re2.create ~options:[ `Dot_nl true ] 

를 호출하여 문서화 here 또는 OCaml의에서 플래그 구문 (?s)<key>Tag.*<\\/array>을 사용하여 진정한 중 하나를 설정할 수 있기 때문에 m 컨트롤 ^$의 해석. 귀하의 패턴은 ^ 또는 $을 사용하지 않습니다.

또한 경고 : You cannot parse XML with regex

+0

감사합니다. 난 단지 DayOne 저널의 데이터를 수정하고 싶습니다, XML 형식은 간단합니다,이 경우에는 정규식이 작동합니다. – liweijian

0

Re2는 기본적으로 정규식을 라인별로 일치시킵니다. 그래서 정규 표현식이 일치하지 않습니다.

The documention에는 여러 줄 일치를위한 m 플래그가 포함되어 있습니다. JaneStreet의 re2 바인딩이 이러한 플래그를 설정할 수 있는지는 모르겠지만 여기에서 찾고있는 것은 분명합니다.

나는 눈을 떼지 않고 나는 내 대답을 새롭게 업데이트 할 것이다. 나는 유용한 것을 발견한다.