アスカーのサンプル文字列を正しく処理するように編集
私は正規表現を使うのが好きです。これにより、姓名に任意の文字を使用できます。文字列には最大 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