搜索非转义单引号

时间:2013-11-22 22:25:53

标签: regex ocaml

我需要编写一个函数来搜索单引号('),同时跳过转义引号(\')。我知道我可以使用这样的函数进行模式搜索:

   let contains string pattern =
     begin
     let re = Str.regexp_string pattern
     in
       try ignore (Str.search_forward re string 0); true
       with Not_found -> false
     end

但是,我如何才搜索非转义报价?

2 个答案:

答案 0 :(得分:0)

我会说一个非转义引用是指在输入开头或者没有反斜杠的引号。不幸的是,OCaml正则表达式中的特殊字符用反斜杠标记,反斜杠需要在OCaml字符串中加倍。所以你会得到如下内容:

let neq = "\\(^\\|[^\\]\\)'"

它只是说“(输入的开头或非反斜杠)后跟一个引号”。

请勿使用Str.regexp_string。其目的是生成一个与给定字符串完全匹配的正则表达式。您想要使用“真正的”正则表达式。因此,请使用Str.regexp

作为旁注,如果你真的只想找到未转义的引号字符(而不是学习正则表达式),那么只需查找引号字符然后测试前一个字符以查看它是否为反斜杠就会容易得多

答案 1 :(得分:0)

Core中的String.Escaping模块(确保安装Core,然后先执行open Core.Std)可让您在此处执行所需操作。

utop[9]> String.Escaping.index ~escape_char:'\\'  "a\\'sdfde" '\'';;
- : int option = None
utop[10]> String.Escaping.index ~escape_char:'\\'  "a'sdfde" '\'';;
- : int option = Some 1
utop[11]> String.Escaping.index ~escape_char:'\\'  "asdfde" '\'';;
- : int option = None