我发现自己想要在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中修复它可能不是完全无关紧要。
你如何编写每个匹配字符串的操作?
答案 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)
我想这并不比我最初的尝试更笨拙。正则表达式相当简单,因为它只需要找到句子之间的位。