短划线后将第一个字符大写

时间:2016-03-12 19:12:23

标签: ruby regex

所以我有一个字符串是一个格式不正确的名字。让我们来说," Jean-paul Bertaud-alain"。

我想在Ruby中使用正则表达式来查找每个破折号后的第一个字符并将其设为大写。因此,在这种情况下,我想要应用一种方法来产生:" Jean-Paul Bertaud-Alain"。

任何帮助?

3 个答案:

答案 0 :(得分:1)

String#gsub可以采用块参数,所以这很简单:

str = "Jean-paul Bertaud-alain"
str.gsub(/-[a-z]/) {|s| s.upcase }
# => "Jean-Paul Bertaud-Alain"

或者,更简洁:

str.gsub(/-[a-z]/, &:upcase)

请注意,正则表达式/-[a-z]/仅匹配a-z范围内的字母,这意味着它不会匹配,例如à。这是因为String#upcase无论如何都不会尝试使用变音符号来大写字符,因为大写是依赖于语言的(例如i在土耳其语中的资本化程度与英语不同)。请阅读此答案以获取更多信息:https://stackoverflow.com/a/4418681

答案 1 :(得分:0)

"Jean-paul Bertaud-alain".gsub(/(?<=-)\w/, &:upcase)
# => "Jean-Paul Bertaud-Alain"

答案 2 :(得分:0)

我建议您通过要求提升信件来使测试更加苛刻:1)前面加上大写单词后跟一个大字,2)后跟小写字母后跟单词分隔符。

r = /
    \b        # Match a word break
    [A-Z]     # Match an upper-case letter
    [a-z]+    # Match >= 1 lower-case letters
    \-        # Match hypen
    \K        # Forget everything matched so far
    [a-z]     # Match a lower-case letter
    (?=     # Begin a positive lookahead
      [a-z]+  # Match >= 1 lower-case letters
      \b      # Match a word break
    )         # End positive lookahead
    /x        # Free-spacing regex definition mode

"Jean-paul Bertaud-alain".gsub(r) { |s| s.upcase }
  #=> "Jean-Paul Bertaud-Alain"

"Jean de-paul Bertaud-alainM".gsub(r) { |s| s.upcase }
  #=> "Jean de-paul Bertaud-alainM"