我想匹配包含任何字符"a"
到"z"
或"["
或"]"
的字符串,但没有别的。正则表达式应匹配
"b"
"]abc["
"ab[c"
但不是这些
"2"
"(abc)"
我试过了:
let content_check(s:string):bool =
Str.string_match (Str.regexp "^[a-z[\]]*$") s 0;;
content_check "]abc[";;
并且警告说“]之前的”逃脱“是非法的,虽然我很确定相当于,比如,sed或awk会正常工作。
无论如何,我试图取消逃脱,但
let content_check(s:string):bool =
Str.string_match (Str.regexp "^[a-z[]]*$") s 0;;
根本不起作用,因为它应匹配a-z
或"["
中的任何一个,然后第一个"]"
关闭“任意”选项,之后必须有任何数字"]"
的。{所以它应该匹配
[abc]]]]
但不是
]]]abc[
在实践中,这根本不是发生的事情;我得到以下内容:
# let content_check(s:string):bool =
Str.string_match (Str.regexp "^[a-zA-Z[]]*$") s 0;;
content_check "]abc[";;
content_check "[abc]]]";;
content_check "]abc[";;
val content_check : string -> bool = <fun>
# - : bool = false
# - : bool = false
# - : bool = false
任何人都可以解释/建议替代方案吗?
@Tim Pietzker的建议听起来非常好,但似乎不起作用:
# #load "str.cma" ;;
let content_check(s:string):bool =
Str.string_match (Str.regexp "^[a-z[\\]]*$") s 0;;
content_check "]abc[";;
# val content_check : string -> bool = <fun>
# - : bool = false
#
当我双重逃避模式中的“[”时,它也不起作用,以防万一。 :(
确实,这是一个MWE:
#load "str.cma" ;;
let content_check(s:string):bool =
Str.string_match (Str.regexp "[\\]]") s 0;;
content_check "]";; (* should be true *)
答案 0 :(得分:1)
这不会真正回答你的问题,但它会解决你的问题。使用re库:
let re_set = Re.(rep (* "rep" is the star *) @@ alt [
rg 'a' 'z' ; (* the range from a to z *)
set "[]" ; (* the set composed of [ and ] *)
])
(* version that matches the whole text *)
let re = Re.(compile @@
seq [ start ; re_set ; stop ])
let content_check s =
Printf.printf "%s : %b\n" s (Re.execp re s)
let () =
List.iter content_check [
"]abc[" ;
"[abc]]]" ;
"]abc[" ;
"]abc[" ;
"abc@#"
]
正如您所注意到的那样,stdlib中的str
很笨拙,将其放在中间位置。 re
是一个非常好的选择,它带有各种正则表达式语法和组合器(我倾向于使用它,因为我认为它比regexp语法更容易使用)。
答案 1 :(得分:0)
来自&#34; Str&#34;文档:&#34;要在集合中包含]字符,请将其设置为集合中的第一个字符。&#34;
有了这个,就不太清楚如何搜索&#34;除了一个&#34;以外的任何东西,因为你必须放置&#34; ^&#34;在它面前。叹。
:(