如何在Elixir中操作正则表达式替换字符串

时间:2014-01-22 17:42:57

标签: regex erlang elixir

我发现自己想要在Elixir中这样做:

re_sentence_frag = %r/(\w([^\.]|\.(?!\s|$))*)(?=\.(\s|$))/
Regex.replace(re_sentence_frag, " oh.  a DOG. woOf. ", String.capitalize("\\1"))

当然,这没有任何效果。 (它仅将字符串"\\1"大写一次。)我真正想要的是将String.capitalize/1应用于replace函数找到的每个匹配项。但是第3个参数不能采用函数引用,因此传递&(String.capitalize("\\1")也不起作用。

这似乎是如此根本,以至于我感到惊讶,这是不可能的。还有另一种方法可以巧妙地表达这种操纵吗?看起来底层的Erlang库不会立即支持将函数引用作为第3个参数传递,因此在Elixir中修复它可能不是完全无关紧要。

你如何编写每个匹配字符串的操作?

1 个答案:

答案 0 :(得分:2)

以下是基于split的一种解决方案:

" oh.  a DOG. woOf. pi is 3.14159. try version 7.a." |>
String.split(%r/(^|\.)(\s+|$)/)                      |>
Enum.map_join(&String.capitalize/1)

我想这并不比我最初的尝试更笨拙。正则表达式相当简单,因为它只需要找到句子之间的位。