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

Ben*_*per 2 regex ocaml

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

dki*_*kim 6

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

# let r = Str.regexp "\\^" in
    Str.search_forward r "FOO^BAR" 0;;
- : int = 3        
Run Code Online (Sandbox Code Playgroud)

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

# let r = Str.regexp {|\^|} in
    Str.search_forward r "FOO^BAR" 0;;
- : int = 3
Run Code Online (Sandbox Code Playgroud)

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

# let r = Str.regexp_string "^" in
    Str.search_forward r "FOO^BAR" 0;;
- : int = 3
Run Code Online (Sandbox Code Playgroud)

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

# let r = Str.regexp "||" in
    Str.search_forward r "FOO||BAR" 0;;
- : int = 3
Run Code Online (Sandbox Code Playgroud)

| 必须在只想将其用作"或"构造时引用:

# let r = Str.regexp "BAZ\\|BAR" in
    Str.search_forward r "FOOBAR" 0;;
- : int = 3
Run Code Online (Sandbox Code Playgroud)

您可能希望引用Str.regexp以获取正则表达式的完整语法.