尝试使用转义字符时,OCaml正则表达式是错误的

时间:2017-04-09 14:04:17

标签: regex ocaml

我试图使用OCaml为C上的变体写一个词法分析器。对于词法分析器,我需要匹配字符串" ^"和" ||" (分别为指数和/或符号)。这两个都是正则表达式中的特殊字符,当我尝试使用反斜杠转义它们时,没有任何变化,代码就像" \ ^"仍然是线的开始和" \ | \ |"仍然是#34;或者"。我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:6)

字符串文字中的反斜杠字符必须加倍才能使它们超过OCaml字符串解析器:

# let r = Str.regexp "\\^" in
    Str.search_forward r "FOO^BAR" 0;;
- : int = 3        

如果您使用的是OCaml 4.02或更高版本,您还可以使用quoted strings ({| ... |}),它不会特别处理反斜杠字符。这可能会导致代码更易读,因为反斜杠字符不必加倍:

# let r = Str.regexp {|\^|} in
    Str.search_forward r "FOO^BAR" 0;;
- : int = 3

或者您可以考虑使用Str.regexp_string(或Str.quote),它会创建一个正则表达式,该表达式将字面上匹配其参数中的所有字符:

# let r = Str.regexp_string "^" in
    Str.search_forward r "FOO^BAR" 0;;
- : int = 3

Str模块不会将|作为特殊的正则表达式字符,因此您不必担心在想要按字面意思使用它时引用:

# let r = Str.regexp "||" in
    Str.search_forward r "FOO||BAR" 0;;
- : int = 3

|只有在您想将其用作“或”结构时才需要引用:

# let r = Str.regexp "BAZ\\|BAR" in
    Str.search_forward r "FOOBAR" 0;;
- : int = 3

您可能需要参考Str.regexp获取正则表达式的完整语法。