gpt4 book ai didi

regex - OCaml 正则表达式在尝试使用转义字符时出现错误

转载 作者:行者123 更新时间:2023-12-02 08:14:21 24 4
gpt4 key购买 nike

我正在尝试使用 OCaml 为 C 的变体编写词法分析器。对于词法分析器,我需要匹配字符串“^”和“||” (分别作为求幂和或符号)。这两个都是正则表达式中的特殊字符,当我尝试使用反斜杠对它们进行转义时,没有任何变化,代码运行时就好像“\^”仍然是行首,“\|\|”仍然是“或或”。我该怎么做才能解决这个问题?

最佳答案

字符串文字中的反斜杠字符必须加倍才能通过 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获取正则表达式的完整语法。

关于regex - OCaml 正则表达式在尝试使用转义字符时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43307623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com