2016-03-29 13 views
2

名前の接頭辞をすべて削除します。 (例えば、教授、博士、ミスター等)は、任意の順序で複数であってもよい。だから、sliceこれらの接頭辞のすべての正規表現を書いてみたいです。私はrubyでこれをしたいと思います。複数の単語のルビ正規表現

以下は、達成したい入出力設定です。

"Prof. Dr. John Doe" => "John Doe" 
"Dr. Prin. Gloria Smith" => "Gloria Smith" 
"Dr. William" => "William" 
"Sean Paul" => "Sean Paul" 

削除したプレフィックスを別の文字列に保存したい場合もあります。

"Prof. Dr. John Doe" => "Prof. Dr." 
"Dr. Prin. Gloria Smith" => "Dr. Prin." 
"Dr. William" => "Dr." 
"Sean Paul" => "" 
+1

"etc"でぼかしするだけではありません。あなたが関係する接頭辞が何であるかを明確に述べてください。 – sawa

+1

@sawaできません。接頭辞のうち、すべてが言及することはできませんので、配列を考慮してください。 – Datt

+0

あなたは言及できないものをどのように削除できますか? – sawa

答えて

3

Prof.は、Dr.は、Mr.は、Mrs.は、Prin.Ms.はあなたが試すことができます削除されたプレフィックスを別の文字列に格納する)

また

"John Doe" 

これは、期間(博士または博士)の有無にかかわらず一致します 、 ':

s = "Prof. Dr. John Doe" 
s.scan(/Prof.|Dr.|Mr.|Mrs.|Prin.|Ms./).join("") 
=> "Prof.Dr." 
+0

削除された接頭辞を別の文字列に保存したいと思います。 – Datt

+1

Dr. Dreが完全に消えます。 – steenslag

+0

'name#=>" John Doe "'が最初の部分で返されたとします。次に、2番目の部分については、 's [0、s.size-name.size] .rstrip#=>" Prof. Dr. "'。 –

0

使用このコード:2番目の質問については

s = "Prof. Dr. John Doe" 
s.gsub(/Prof.|Dr.|Mr.|Mrs.|Prin.|Ms./, "").strip 

(たい:接頭辞を想定すると、

"Dr. Prin. Gloria Smith".split(". ").last 
"Prof. Dr. John Doe".split(". ").last 
+1

これは場合によっては機能しません。名前は 'Gloria A. Smith'になることがあります。 – Datt

1

あなたは正規表現を求めたので:

str = "Prof. Dr. John Doe" 
str.remove(/((Dr|Mr|Prof|Prin)\.? ?)/i) 

をこれはになります私は最後にそれが小文字の「博士」と「専門家」に一致するようにします。

+2

@RajarshiDas OPがタグ付けしたRailsメソッドのように見えます。 – sawa

+0

ooh yes correct –

3

ケース1:タイトルのリストはそう(str[R] || "").rstrip #=> "".rstrip #=> ""、最後の2つの例、str[R] => nilのように、

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.", ""] 

何のタイトルがない場合

と仮定

を与えています。

どのように使用されているかは、クラスメソッドRegexp::unionのdocを参照してください。

ケース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.", ""] 

注:元の回答を簡略化しました。

+0

これは良い答えだと思います。正規表現の活用。 – MTarantini

0

常にドット(。あなたは上記の配列に見ることができるように、すべてのプレフィックス

s = "Prof. Dr. John Doe" 
dictionary = ['Prof\.', 'Dr\.', 'Mr\.', 'Mrs\.', 'Prin\.'].join('|\s*') 
match = s.match(/((?:#{dictionary})*)\s*([\w\s\.]+)/) 
prefix = match[1] 
name = match[2] 

の辞書を持っていた場合)の接頭辞の後に、あなたは以下のロジックに

s = "Prof. Dr. John Doe" 
match = s.match(/([\w\s\.]+\.)?\s*([\w\s]+)/) 
prefix = match[1] 
name = match[2] 

OR

を使用することができます(辞書など)接頭辞は正規表現のドット(。)でエスケープされた正規表現では、異なる意味を持ちます。つまり、任意の文字を表すメタ文字です。http://www.regular-expressions.info/dot.html

+0

@Dattaは、正規表現が意味することに必要な説明があれば教えてください –