2013-10-21 17 views
1

我正在寫一個小函數來從完整聯繫人姓名字段中刪除常見標題。這是我到目前爲止有:從完整聯繫人名稱刪除標題

string[] CommonTitles = new string[] { "MR ", "MRS ", "MS ", "MISS ", "DR ", "HERR ", "MONSIEUR ", "HR ", "FRAU ", "A V M ", "ADMIRAAL ", 
       "ADMIRAL ", "ALDERMAN ", "ALHAJI ", "AMBASSADOR ", "BARON ", "BARONES ", "BRIG ", "BRIGADIER ", "BROTHER ", "CANON ", "CAPT ", "CAPTAIN ", 
       "CARDINAL ", "CDR ", "CHIEF ", "CIK ", "CMDR ", "COL ", "COLONEL ", "COMMANDANT ", "COMMANDER ", "COMMISSIONER ", "COMMODORE ", "COMTE ", 
       "COMTESSA ", "CONGRESSMAN ", "CONSEILLER ", "CONSUL ", "CONTE ", "CONTESSA ", "CORPORAL ", "COUNCILLOR ", "COUNT ", "COUNTESS ", "AIR CDRE ", 
       "AIR COMMODORE ", "AIR MARSHAL ", "AIR VICE MARSHAL ", "BRIG GEN ", "BRIG GENERAL ", "BRIGADIER GENERAL ", "CROWN PRINCE ", "CROWN PRINCESS ", 
       "DAME ", "DATIN ", "DATO ", "DATUK ", "DATUK SERI ", "DEACON ", "DEACONESS ", "DEAN ", "DHR ", "DIPL ING ", "DOCTOR ", "DOTT ", "DOTT SA ", 
       "DR ", "DR ING ", "DRA ", "DRS ", "EMBAJADOR ", "EMBAJADORA ", "EN ", "ENCIK ", "ENG ", "EUR ING ", "EXMA SRA ", "EXMO SR ", "F O ", 
       "FATHER ", "FIRST LIEUTIENT ", "FIRST OFFICER ", "FLT LIEUT ", "FLYING OFFICER ", "FR ", "FRAU ", "FRAULEIN ", "FRU ", "GEN ", "GENERAAL ", 
       "GENERAL ", "GOVERNOR ", "GRAAF ", "GRAVIN ", "GROUP CAPTAIN ", "GRP CAPT ", "H E DR ", "H H ", "H M ", "H R H ", "HAJAH ", "HAJI ", 
       "HAJIM ", "HER HIGHNESS ", "HER MAJESTY ", "HERR ", "HIGH CHIEF ", "HIS HIGHNESS ", "HIS HOLINESS ", "HIS MAJESTY ", "HON ", "HR ", 
       "HRA ", "ING ", "IR ", "JONKHEER ", "JUDGE ", "JUSTICE ", "KHUN YING ", "KOLONEL ", "LADY ", "LCDA ", "LIC ", "LIEUT ", "LIEUT CDR ", 
       "LIEUT COL ", "LIEUT GEN ", "LORD ", "MADAME ", "MADEMOISELLE ", "MAJ GEN ", "MAJOR ", "MASTER ", "MEVROUW ", "MISS ", "MLLE ", "MME ", 
       "MONSIEUR ", "MONSIGNOR ", "MSTR ", "NTI ", "PASTOR ", "PRESIDENT ", "PRINCE ", "PRINCESS ", "PRINCESSE ", "PRINSES ", "PROF ", 
       "PROF DR ", "PROF SIR ", "PROFESSOR ", "PUAN ", "PUAN SRI ", "RABBI ", "REAR ADMIRAL ", "REV ", "REV CANON ", "REV DR ", "REV MOTHER ", 
       "REVEREND ", "RVA ", "SENATOR ", "SERGEANT ", "SHEIKH ", "SHEIKHA ", "SIG ", "SIG NA ", "SIG RA ", "SIR ", "SISTER ", "SQN LDR ", "SR ", 
       "SR D ", "SRA ", "SRTA ", "SULTAN ", "TAN SRI ", "TAN SRI DATO ", "TENGKU ", "TEUKU ", "THAN PUYING ", "THE HON DR ", "THE HON JUSTICE ", 
       "THE HON MISS ", "THE HON MR ", "THE HON MRS ", "THE HON MS ", "THE HON SIR ", "THE VERY REV ", "TOH PUAN ", "TUN ", "VICE ADMIRAL ", 
       "VISCOUNT ", "VISCOUNTESS ", "WG CDR " }; 



      string returnName = textBox1.Text.ToUpper(); 

      foreach (string title in CommonTitles) 
      { 
       returnName = returnName.Replace(title, ""); 
      } 

      MessageBox.Show(returnName); 

不過,我只是試圖用下面的輸入測試:坤仁阿布迪娜先生夫人TOH主要但我得到這個回:坤藪DINA TOH MAJOR

有什麼比使用REPLACE函數更好嗎?

感謝您的幫助提前。

+5

它不會取代主要的原因是你的常用標題旁邊有每個標題的空間,以及主要在你的例子沒有一個(因爲它是硬道理)。這是一個非常醜陋的功能,容易出錯。 – JonH

+0

在調試器中使用替換中的斷點運行它 - 我敢打賭,你有兩個或多個碰撞的標題 –

+0

IMO這不是一種刪除標題的方法。如果先生和夫人喜歡''Toh Major先生'之後有一個點,那麼它會變成''Toh Major'? –

回答

4

您可以使用正則表達式。首先,您必須從所有標題中刪除尾部空格。然後,您可以使用錨點\b匹配單詞邊界。爲了避免額外的空間,您還需要在標題前面或後面匹配空格(我之後通過使用\s*來完成)。你可能仍然有一個尾隨空格,所以你還需要Trim()字符串:

var regex = new Regex(@"\b(" + string.Join("|", CommonTitles) + @")\b\s*"); 
var result = regex.Replace("KHUN YING ABU DINA MR MRS TOH MAJOR", String.Empty).Trim(); 

這導致:

 
ABU DINA TOH 

您還可以讓正則表達式處理案件的問題,以避免一切轉換成大寫。使用時只需將RegexOptions.IgnoreCase

var regex = new Regex(
    @"\b(" + string.Join("|", CommonTitles) + @")\b\s*", 
    RegexOptions.IgnoreCase 
); 
var result = regex.Replace("Khun Ying Abu Dina Mr Mrs Toh Major", String.Empty).Trim(); 

現在的結果是:

 
Abu Dina Toh 
+0

感謝Martin,這太棒了! –