2010-07-10 88 views
17

Quiero usar regexps en OCaml y parece que el módulo Str proporciona estas funcionalidades.Expresiones regulares en OCaml

así que traté con un programa sencillo:

open Str 
let regx = regexp "." 

pero me da el siguiente error

File "lol.ml", line 1, characters 0-1: Error: Error while linking lol.cmo: Reference to undefined global `Str'

Como si el módulo no está presente, pero si quito open Str dice que regexp es una valor sin consolidar

No entiendo qué tipo de problema es, Str debe haber un módulo estándar (de acuerdo con http://caml.inria.fr/pub/docs/old-311/libref/Str.html) así que estoy desorientado .. Lo único que pensé es que la firma (mli) está presente pero su aplicación (ml) no lo es.

Estoy ejecutando Objective Caml version 3.11.0 según la herramienta ocaml.

¿Alguien me puede ayudar a resolver esto? Gracias de antemano

+3

Si puede evitarlo, * muy * Don No quiero usar el módulo 'Str'. Su API no es reentrante, lo que genera todo tipo de problemas. Afortunadamente, PCRE tiene buenos enlaces OCaml en: http://www.ocaml.info/home/ocaml_sources.html. También es posible que desee comprobar Mikmatch para obtener soporte de sintaxis en la parte superior del motor PCRE. –

Respuesta

25

Desde the manual:

Programs that use the str library must be linked as follows:

ocamlc other options str.cma other files 
ocamlopt other options str.cmxa other files 
+1

¡Gracias, no sabía ese problema! – Jack

16

o puede poner

#load "str.cma";; 

si usted lo está haciendo en el intérprete

+0

Gracias, esto será útil al intentar desde toplevel – Jack

+0

hola @newacct, ¿puede explicar por qué el ocamllex muestra un error cuando coloco esa línea en 1ra línea en mi lexer.mll? el error es: referencia a 'Str 'global indefinido ... –

1

Como alternativa al módulo Str también hay Re2.

  1. instalarlo usando opam install re2
  2. Uso del módulo en your_file.ml así:

    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. compilar con ocamlbuild -use-ocamlfind -package re2 -package core -tag thread your_file.byte