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