如何在OCaml中使用“匹配”和正则表达式匹配字符串?

时间:2014-08-09 17:29:19

标签: regex ocaml ocamllex

我的OCaml .ml代码如下所示:

open Str

let idregex = Str.regexp ['a'-'z' 'A'-'Z']+ ['a'-'z' 'A'-'Z' '0'-'9' '_']*;

let evalT (x,y) = (match x with 
    Str.regexp "Id(" (idregex as var) ")" -> (x,y)

为什么上面的代码不起作用?我怎样才能让它发挥作用?

编辑:

我不需要做很多解析。所以,我希望它保留在OCaml .ml文件而不是OCamllex文件

2 个答案:

答案 0 :(得分:5)

match关键字适用于OCaml模式。正则表达式不是OCaml模式,它是一种不同的模式,因此您不能使用match

regexp函数相同的Str module是匹配函数。

如果要进行大量正则表达式匹配,可以使用ocamllex,它会读取与idregex的(不幸的无效)定义类似的定义文件,并生成OCaml代码做匹配。

这是一个会话,展示了如何使用Str模块对模式进行简单匹配。

$ ocaml
        OCaml version 4.01.0

# #load "str.cma";;
# let idregex = Str.regexp "[a-zA-Z]+[a-zA-Z0-9_]*";;
val idregex : Str.regexp = <abstr>
# Str.string_match idregex "a_32" 0;;
- : bool = true
# Str.string_match idregex "32" 0;;
- : bool = false

作为旁注,你的代码看起来并不像OCaml。它看起来像是OCaml和ocamllex的混合物。实际上有一个类似于micmatch的系统。您似乎正计划使用库存OCaml语言(我赞赏),但在某些时候看一下micmatch可能会很有趣。

答案 1 :(得分:0)

以下工作可以做吗?

open Str

let evalT (x, y) =
  let idexp = "[a-zA-Z]+ [a-zA-Z0-9_]*" in
  let full_idexp = "^Id(" ^ idexp ^ ")$" in
  let id_match x = string_match (regexp full_idexp) x 0 in
  if id_match x then Some (x, y) else None;;

我是OCaml菜鸟,但是您的代码看起来根本不像OCaml。我发现您的问题很老,但是在某些搜索中仍然足够高,所以我认为这可能对其他人有帮助,即使不是OP。