c# - 从联系人全名中删除头衔

标签 c#

我正在编写一个小函数来从完整的联系人姓名字段中删除常用头衔。这是我目前所拥有的:

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);

但是,我刚刚尝试使用以下输入对此进行测试:KHUN YING Abu Dina MRS TOH MAJOR 但我得到了回复:KHUN YABU DINA TOH MAJOR

有什么比使用 REPLACE 函数更好的方法吗?

提前感谢您的帮助。

最佳答案

您可以使用正则表达式。首先,您必须从所有标题中删除尾随空格。然后你可以使用 anchor \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

You can also let the regular expression handle the case problem to avoid converting everything to upper case. Simply use the 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

关于c# - 从联系人全名中删除头衔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19497617/

相关文章:

c# - 查找申请人当前的 URl

c# - Powershell 和 C# 中的交换

c# - JavaScript 从 C# 背后的代码确认

c# - 如何在 visual studio 2012 中获取 AngularJS 的智能感知

C# 类型需要特定类的子类以及接口(interface)

c# - 如何将 C# 变量声明为 HTML 类型变量?

c# - Threading.Timer 在控制台应用程序中停止

c# - 不同泛型的数组

c# - 生产环境中transactionScope和ServiceBus的问题

c# - C# 中的状态机