Регулярные выражения в OCaml

Я хочу использовать регулярные выражения в OCaml, и мне кажется, что модуль Str предоставляет эти функции.

Итак, я попробовал с простой программой:

open Str
let regx = regexp "."

но это дает мне следующую ошибку

Файл "lol.ml", строка 1, символы 0-1: Ошибка: Ошибка при связывании lol.cmo: Ссылка на неопределенный глобальный `Str '

Как будто модуля нет, но если я удалю open Str, он говорит, что regexp является несвязанным значением.

Я не понимаю, что это за проблема, Str должен быть стандартным модулем (согласно http://caml.inria.fr/pub/docs/old-311/libref/Str.html), так что я ничего не понимаю .. единственное, что я думал, это подпись ( mli) присутствует, а реализация (ml) - нет.

Я использую Objective Caml version 3.11.0 в соответствии с ocaml инструментом.

Может ли кто-нибудь помочь мне разобраться в этом? заранее спасибо


person Jack    schedule 10.07.2010    source источник
comment
Если вы можете этого избежать, вы действительно не хотите использовать модуль Str. Его API не реентерабелен, что приводит к всевозможным проблемам. К счастью, у PCRE есть хорошие привязки OCaml по адресу: ocaml.info/home/ocaml_sources.html Вы также можете проверить Mikmatch для поддержки синтаксиса поверх движка PCRE.   -  person Michael Ekstrand    schedule 11.07.2010


Ответы (3)


Из руководства:

Программы, использующие библиотеку str, должны быть связаны следующим образом:

ocamlc other options str.cma other files
ocamlopt other options str.cmxa other files
person sepp2k    schedule 10.07.2010

Или вы можете поставить

#load "str.cma";;

если вы делаете это в интерпретаторе

person newacct    schedule 11.07.2010
comment
Спасибо, это будет полезно при попытке с верхнего уровня - person Jack; 11.07.2010
comment
привет @newacct, не могли бы вы объяснить, почему ocamllex отображает ошибку, когда я помещаю эту строку в 1-ю строку в моем lexer.mll? ошибка: Ссылка на неопределенный глобальный `Str '.... - person Trung Bún; 04.03.2014

В качестве альтернативы модулю Str существует также _2 _.

  1. Установите его с помощью opam install re2
  2. Используйте модуль в your_file.ml следующим образом:

    open Re2.Std
    open Re2.Infix
    let change input_text = Re2.rewrite_exn ~/"change this" "to that" input_text
    let () = printf "%s" (change "change this")
    
  3. Компилировать с ocamlbuild -use-ocamlfind -package re2 -package core -tag thread your_file.byte

person Matthias Braun    schedule 24.09.2015