2

" " という名前が与えられた場合、Rigobert Songどうすれば " " を返すことができRigobert S.ますか?

名前は、Rigobert J. Songまたは単にRigobert. Rigobert S.前編も後編もまた行きたいですRigobert

私はこれを書きました、これはうまくいきます。もっと「Rubyの方法」はありますか?

def initials_for(user)
  if user.name.split.size > 1
    "#{user.name.split.first} #{user.name.split.last[0]}"
  else
    user.name
  end
end
4

5 に答える 5

4
"Rigobert J. Song"
.gsub(/\s+.+\s+/, " ").sub(/(?<=\s\S).+/, ".")
# => "Rigobert S."

"Rigobert Song"
.gsub(/\s+.+\s+/, " ").sub(/(?<=\s\S).+/, ".")
 # => "Rigobert S."

"Rigobert"
.gsub(/\s+.+\s+/, " ").sub(/(?<=\s\S).+/, ".")
 # => "Rigobert"
于 2013-08-21T15:07:00.063 に答える
2

何回も分割する必要はありません。変数に入れることができます

def initials_for(user)
  name_arry = user.name.split
  name_arry.size > 1 ? "#{name_arry.first} #{name_arry.last[0]}" : user.name
end
于 2013-08-21T15:10:27.057 に答える
1

ruby-on-rails としてタグ付けしたので、利用できると思いpresent?ます...

def initials_for(full_name)
  (first_name, *, last_name) = full_name.split
  [first_name, name_initial(last_name)].reject(&:blank?).join(" ")
end

def name_initial(name)
  if name.present?
    "#{name[0]}."
  else
    ""
  end
end

puts initials_for(user.name)

最初に、このヘルパー内での user の使用を除外しました。これは、この関数が知る必要のない依存関係です。puts 行に示されているように文字列を渡します。

他のいくつかが示すように、2 番目のイニシャルをピリオドで処理するヘルパーを作成しました。次に、パーツを配列に集め、空白のパーツを拒否し、それらをスペースで結合します。

スプリットの左側にスプラットと意図を明らかにする変数が使用されていることに注意してください。試してみると、first_name には常に左端の名前があり、last_name には常に右端の名前があるか、名前が 1 つしかない場合は nil であることがわかります。

私は、名、姓、ミドルネーム、旧姓、一般名のバリエーションを扱うときに、この拒否と結合のパターンをよく使用し、余分な文字などを含まない読みやすい名前を残します。

于 2013-08-21T15:34:56.067 に答える
1

これもうまくいくでしょう。しかし、それが必ずしも「より良い」解決策であるかどうかはわかりません。

def initials_for(user)
  parts = user.name.split
  name = parts.first
  name += " #{parts.last[0]}." if parts.length > 1
  name
end
于 2013-08-21T15:11:06.060 に答える
-1

アスカーのサンプル文字列を正しく処理するように編集

私は正規表現を使うのが好きです。これにより、姓名に任意の文字を使用できます。文字列には最大 2 つのスペースが必要です。

スペースがゼロの場合、すべての文字が名前としてキャプチャ グループ 1 に配置されます。

スペースが 1 つある場合、スペースの前の文字は名前としてキャプチャ グループ 1 に配置され、スペースの後の文字は姓としてキャプチャ グループ 3 に配置されます。

スペースが 2 つある場合、最初のスペースの前の文字はキャプチャ グループ 1 に配置されます。キャプチャ グループ 2 のスペース間の文字。およびキャプチャ グループ 3 の 2 番目のスペースの後の文字。

#output
Testing Rigobert Song
Rigobert S.
Testing Rigobert J. Song
Rigobert S.
Testing Rigobert J.Song
Rigobert J.
Testing RigobertJ.Song
RigobertJ.Song
Testing Rigobert
Rigobert


tests = [ "Rigobert Song", "Rigobert J. Song", "Rigobert J.Song", "RigobertJ.Song", "Rigobert", ]
regex=\
 /^([^ ]*) ?([^ ]* )?([^ ]+)?$/
#- - - - - - - - - - - - - - -
# ^- - - - - - - - - - - - - - Match start of string here
#  ^ - - ^ - - - - - - - - - - Begin/End capture group 1
#   ^^^^^- - - - - - - - - - - Match 0 or more of any non-space character
#         ^^ - - - - - - - - - Match zero or one literal space
#           ^- - - ^ - - - - - Begin/End capture group 2
#            ^^^^^ - - - - - - Match 0 or more non-space characters...
#                 ^- - - - - - ... with exactly one trailing space
#                   ^- - - - Make Capture group 2 optional (match 0 or 1)
#                    ^ - - ^ - Begin/end capture group 3
#                     ^^^^^- - Match 1 or more non-space characters
#                           ^- Make capture group 3 optional
#                            ^ Match end of string here

tests.each do |str|
  puts "Testing #{str}"
  match = regex.match(str)
  if(match != nil)
    first = match[1]
    middle = match[2] || ""
    last = match[3] || ""
    if(first != "" && last != "")
      puts(first+" "+last[0].chr+".") # ruby 1.8
      #puts(first+' '+last[0]+".")     # ruby 1.9
    else
      if(first != "" && last == "")
        puts(first)
      else
        puts('Invalid name format')
      end
    end
  else 
    puts('No regex match')
  end
end
于 2013-08-21T15:52:06.633 に答える