如何使用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”,但似乎无效。有人可以提出可能出错的地方吗?
答案 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]
无效:[...]
是一个字符类,请求正则表达式引擎匹配x
,1
或{{ 1}}。