使用正则表达式匹配Ocaml中的确切字符串

时间:2011-12-30 12:03:35

标签: regex ocaml

如何使用Ocaml中的正则表达式查找完全匹配?例如,我有一个这样的代码:

let contains s1 s2 =
let re = Str.regexp_string s2
in
try ignore (Str.search_forward re s1 0); true
with Not_found -> false

其中s2为“_X_1”,s1将“A_1_X_1”,“A_1_X_2”,......等字符串输入函数“contains”。目的是在s1为“A_1_X_1”时找到完全匹配。但即使s1为“A_1_X_10”,“A_1_X_11”,“A_1_X_100”等,当前代码也会找到匹配。

我尝试使用“[_x_1]”,“[_ X_1] $”作为s2而不是“_X_1”,但似乎无效。有人可以提出可能出错的地方吗?

3 个答案:

答案 0 :(得分:3)

您可以使用$元字符来匹配行的末尾(假设字符串不包含多行,则为字符串的结尾)。但你不能通过Str.regexp_string来表达这一点;这只是逃脱了元字符。您应该首先引用实际的子字符串部分,然后附加$,然后从中创建一个正则表达式:

let endswith s1 s2 =
  let re = Str.regexp (Str.quote s2 ^ "$")
  in
  try ignore (Str.search_forward re s1 0); true
  with Not_found -> false

答案 1 :(得分:2)

Str.match_end就是您所需要的:

let ends_with patt str =
  let open Str in
  let re = regexp_string patt in
  try
    let len = String.length str in
    ignore (search_backward re str len);
    match_end () == len
  with Not_found -> false

使用此定义,该功能可根据您的需要运行:

# ends_with "_X_1" "A_1_X_10";;
- : bool = false
# ends_with "_X_1" "A_1_X_1";;
- : bool = true
# ends_with "_X_1" "_X_1";;
- : bool = true
# ends_with "_X_1" "";;
- : bool = false

答案 2 :(得分:0)

正则表达式将匹配输入中的任何位置,因此您看到的行为是正常的。

您需要锚定正则表达式:^_X_1$

此外,[_x_1]无效:[...]是一个字符类,请求正则表达式引擎匹配x1或{{ 1}}。