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

19

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

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

open Str
let regx = regexp "."

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

  

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

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

Я не понимаю, какая проблема, Str должен быть стандартным модулем (согласно Ссылка ), так что я не знаю. Единственное, что я думал, это то, что подпись ( mli ) присутствует, но реализация ( ml ) не является.

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

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

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

3 ответа

28

В руководстве :

  

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

ocamlc other options str.cma other files
ocamlopt other options str.cmxa other files
    
ответ дан sepp2k 11.07.2010 в 00:41
источник
  • Спасибо, я не знал эту проблему! –  Jack 11.07.2010 в 00:54
18

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

#load "str.cma";;

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

    
ответ дан newacct 11.07.2010 в 02:22
источник
  • Спасибо, это будет полезно при попытке отложить –  Jack 11.07.2010 в 02:32
  • hi @newacct, можете ли вы объяснить, почему ocamllex отображает ошибку, когда я помещаю эту строку в 1-ю строку в моем lexer.mll? ошибка: Ссылка на неопределенный глобальный «Str» .... –  Trung Bún 04.03.2014 в 15:10
1

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

  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

ответ дан Matthias Braun 24.09.2015 в 23:45
источник