Случай 1: список названий дается
Пусть выполнено
titles = ["Dr.", "Prof.", "Mr.", "Mrs.", "Ms.", "Her Worship", "The Grand Poobah"]
R =/
(?: # begin non-capture group
#{Regexp.union(titles)}
# "or" all the titles
\s* # match >= 0 spaces
)* # end non-capture group and perform >= 0 times
/x # free-spacing regex definition mode
#=>/
# (?: # begin non-capture group
# (?-mix:Dr\.|Prof\.|Mr\.|Mrs\.|Ms\.|Her\ Worship|The\ Grand\ Poobah)
# # "or" all the titles
# \s* # match >= 0 spaces
# )* # end non-capture group and perform >= 0 times
# /x
def extract_titles(str)
t = str[R] || ''
[str[t.size..-1], t.rstrip]
end
["Prof. Dr. John J. Doe, Jr.", "Dr. Prin. Gloria Smith", "The Grand Poobah Dr. No",
"Gloria Smith", "Cher, Ph.D."].each { |s| p extract_titles s }
# ["John J. Doe, Jr.", "Prof. Dr."]
# ["Prin. Gloria Smith", "Dr."]
# ["No", "The Grand Poobah Dr."]
# ["Gloria Smith", ""]
# ["Cher, Ph.D.", ""]
Если нет названия, так как в последних двух примерах, str[R] => nil
, так (str[R] || "").rstrip #=> "".rstrip #=> ""
.
См. Документ для метода класса Regexp::union, чтобы узнать, как он используется.
Случай 2: нет список названий
Далее предполагается, что все названия одного слова, начинающиеся с заглавной буквы, а затем один или несколько строчных букв, за которым следует период. Если это неверно, соответствующее регулярное выражение может быть соответствующим образом изменено.
Единственное различие между этим случаем и предыдущим состоит в том, что регулярное выражение изменяется.
R =/
\A # match beginning of string
(?: # start a non-capture group
[A-Z] # match a capital letter
[a-z]+ # match > 0 lower-case letters
\.\s* # match a period followed by >= 0 spaces
)* # end non-capture group and execute >= 0 times
/x # free-spacing regex definition mode
["Prof. Dr. John J. Doe, Jr.", "Dr.Prin.Gloria Smith",
"Gloria Smith", "Cher, Ph.D."].each { |s| p extract_titles(s) }
# ["John J. Doe, Jr.", "Prof. Dr."]
# ["Gloria Smith", "Dr. Prin."]
# ["Gloria Smith", ""]
# ["Cher, Ph.D.", ""]
Примечание: Я упростил свой первоначальный ответ.
Не просто размывайте его с помощью «и т. д.». Четко определите, к каким префиксам вы относитесь. – sawa
@sawa может n нет. префиксов, все они не могут быть упомянуты, поэтому рассмотрим массив. – Datt
Как вы можете удалить то, что вы не можете упомянуть? – sawa