我发现自己想在Elixir中这样做:
re_sentence_frag = %r/(\w([^\.]|\.(?!\s|$))*)(?=\.(\s|$))/
Regex.replace(re_sentence_frag, " oh. a DOG. woOf. ", String.capitalize("\\1"))
当然,那没有任何影响。(它仅仅大写了一次字符串“\1”)。我真正想做的是对
replace
函数匹配到的每一个字符串应用String.capitalize/1
。但是第三个参数不能传递一个函数引用,因此传递&(String.capitalize("\\1"))
也不起作用。这似乎是如此基础,以至于我很惊讶它不可能实现。是否有其他方法可以表达这种操作?看起来底层的Erlang库不会立即支持将函数引用作为第三个参数传递,因此在Elixir中修复这个问题可能不完全简单。
你会如何编程操作每个匹配字符串?
"\\1"
是供正则表达式引擎使用的,而不是 String 类。 - user557597scan
函数并使用结果中的信息手动替换它们。为了代码重用的目的,你可以创建一个接受函数作为参数的包装器函数。 - nhahtdh(?=\w(?:[^\.]|\.(?!\s|$))*)(?=\.(?:\s|$))
进行分割,然后检查每个元素是否与\A(\w(?:[^\.]|\.(?!\s|$))*)(?=\.(?:\s|$))(.*)\z
匹配。 如果匹配,则将组1大写并附加,组2是要附加的其余部分。 如果没有匹配,则只需附加该元素。 所有分割和匹配函数都应为单行修饰符//s
或在所有正则表达式开头放置(?s)
修饰符组。 - user557597