OCaml regexp“any”匹配,其中“]”是其中一个字符

时间:2015-10-31 12:09:49

标签: regex ocaml

我想匹配包含任何字符"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 *)

2 个答案:

答案 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)

我是个白痴。 (但也许Str的设计师也不是那么聪明。)

来自&#34; Str&#34;文档:&#34;要在集合中包含]字符,请将其设置为集合中的第一个字符。&#34;

有了这个,就不太清楚如何搜索&#34;除了一个&#34;以外的任何东西,因为你必须放置&#34; ^&#34;在它面前。叹。

:(