3

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

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

当然,这没有任何影响。(它只将字符串大写"\\1"一次。)我真正的意思是应用String.capitalize/1replace函数找到的每个匹配项。但是第三个参数不能带函数引用,所以传递&(String.capitalize("\\1")也不起作用。

这似乎是如此基本,以至于我很惊讶这是不可能的。是否有另一种方法可以巧妙地表达这种操纵?看起来底层的 Erlang 库不会立即支持将函数引用作为第三个参数传递,因此在 Elixir 中修复这可能并非完全容易。

您将如何对每个匹配的字符串进行编程操作?

4

1 回答 1

2

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

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

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

于 2014-01-22T21:41:44.790 回答