如何从字符串中删除所有非字母字符?
例如
"Wë_1ird?!" -> "Wëird"
在Perl中,我会使用=~ s/[\W\d_]+//g
。在Python中,我会使用
re.sub(ur'[\W\d_]+', u'', u"Wë_1ird?!", flags=re.UNICODE)
等等。
AFAICT,Str.regex
不支持\W
,\d
等等。(我不知道它是否支持Unicode,但是我对此表示怀疑)。
我不是regexes和utf的专家,但是如果我在您的鞋子里,那我会使用re2
库,这是我的第一个近似值:
open Core.Std
open Re2.Std
open Re2.Infix
let drop _match = ""
let keep_alpha s = Re2.replace ~/"\\PL" ~f:drop s
前三行打开库并将其定义纳入范围。您无需打开库即可使用它,否则需要为每个定义加上前缀。OCaml核心库是以这种方式专门设计的,用户应打开Std
子模块以将所有必要的定义带入范围。Re2
库来自同一个人,并具有一致的约定。open Re2.Infix
将把前缀(和前缀运算符)引入作用域,即~/
从字符串创建一个正则表达式。该drop
函数只是忽略其参数,并返回一个空字符串。我给参数加了下划线,因为这是未使用的参数的约定(编译器尊重)。您也可以只将普通uderscore用作通配符,例如let drop _ = ""
。接下来是keep_alpha
该函数将用空字符串替换与utf字母类不匹配的任何utf符号,即从输出中将其删除。
我检查了我的代码,并修复了错误。另外,我想展示如何在顶层使用此代码。您有几种选择,但是最简单的方法是使用库coretop
附带的脚本core
。它使用utop
顶级,因此请确保已安装它:
$ opam install -y utop
一旦完成,就可以启动顶层:
$ coretop -require re2
此-require re2
标志将自动查找并将re2
库加载到您的顶层。您可以加载其他库,而无需utop
使用以下命令重新启动:
# #require "libname";;
第一个#
是顶级提示,您不应该键入它,但是第二个是指令的开始,因此请确保实际键入它。任何指令都应从#
符号开始。utop中还有其他有用的指令,即:
# #use "filename.ml";; (* will load and evaluate filename.ml *)
# #list;; (* will list all available packages *)
# #typeof "keep_alpha";; (* will infer and print type of expression *)
除非您按;;
顺序终止,否则Toplevel不会评估您的代码。有时您可能会;;
在真实的代码中看到这个丑陋的外观,但这不是必需的,只是说顶层,您希望它在此位置评估您的代码并向您显示结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句