OCaml正则表达式在尝试使用转义字符时出现错误 [英] OCaml regex being buggy when trying to use escape characters

查看:27
本文介绍了OCaml正则表达式在尝试使用转义字符时出现错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用OCaml为C语言变体编写词法分析器。对于词法分析器,我需要匹配字符串"^"和"||"(分别作为指数和/或符号)。这两个字符都是regex中的特殊字符,当我尝试使用反斜杠对它们进行转义时,没有任何变化,代码运行起来就好像"^"仍然是行的开头,"||"仍然是"or或"。我可以做些什么来修复此问题?

推荐答案

字符串中的反斜杠字符必须加倍才能通过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

|仅当您要将其用作"or"构造时才必须用引号括起来:

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

有关正则表达式的完整语法,您可能需要参考Str.regexp

这篇关于OCaml正则表达式在尝试使用转义字符时出现错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆