ruby 破折号后的第一个字符大写

qxsslcnc  于 12个月前  发布在  Ruby
关注(0)|答案(4)|浏览(95)

所以我得到了一个格式不正确的字符串。让我们说,“让-保罗伯陶-阿兰”。
我想在Ruby中使用正则表达式来找到每个破折号后面的第一个字符,并将其变为“”。所以,在这种情况下,我想应用一种方法,它会产生:“让-保罗·伯陶-阿兰”
有什么需要帮忙的吗?

z4iuyo4d

z4iuyo4d1#

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

li9yvcax

li9yvcax2#

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

yh2wf1be3#

我建议你通过要求字母大写来使测试更加苛刻: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"
gojuced7

gojuced74#

我想到了这个:
.gsub(/(?<=-|\b)\p{L}/, &:upcase)
这会使任何Unicode字母在断字符或破折号后大写,所以这也适用于非ASCII字符:

"élaine-éclaire De-la rosa".gsub(/(?<=-|\b)\p{L}/, &:upcase)
=> "Élaine-Éclaire De-La Rosa"

相关问题