これを理解するのに時間がかかったので、回答済みの質問に結果を投稿します。
質問: 名前フィールドで可能な区切り記号の配列を使用して文字列を分割し、区切り記号を分割配列に保持し、分割によって配列に作成される可能性のある空白を除外するにはどうすればよいですか。
例: サム・ワシントンとジェナ
私の問題は、私が作成した名前パーサーが書いていたことでした
ファーストネーム:サム
姓 : ジェナ
次のコードを使用して、このように解析できました
ファーストネーム: サム
姓 : ワシントン
Firstname2 ジェナ
ただし、私のジョイナーのリストを使用する場合は、「And」や「OR」などの一般的な名前に含まれる文字列値が含まれていないため、注意してください。
これはあなたの名前を解析します EX: "Andy" は "And" , "Y" になります
EX2: 「グレゴリーは「Greg」「or」「y」
これが誰かに役立つことを願っています。ご不明な点がございましたら、お気軽にメッセージをお送りください。
/// <summary>
/// remove bad name parts
/// </summary>
/// <param name="parts">name parsed for review</param>
public static void CheckBadNames(ref string[] parts)
{
string[] BadName = new string[] {"LIFE", "ESTATE" ,"(",")","*","AN","LIFETIME","INTREST","MARRIED",
"UNMARRIED","MARRIED/UNMARRIED","SINGLE","W/","/W","THE","ET",
"ALS","AS", "TENANT","WIFE", "HUSBAND", "NOT", "DRIVE" ,"INSURED",
"EXCLUDED","DISABLED" ,"LICENSED","TRUSTEE","ATSOT","A T S O T",
"AKA", "-ATSOT","OF","DBA","EVOCABLE","FAMILY","INTEREST","MASTER"};
string[] joiners = new string[9] { "&", @"AND\", @"OR\", "\\", "&/OR", "AND/OR", "&-OR", "/", "OF/AND" };
Restart:
List<string> list = new List<string>(parts); //convert array to list
foreach (string part in list)
{
if (BadName.Any(s => part.ToUpper().Equals(s)) || part == "-")
{
list.Remove(part);
parts = list.ToArray();
goto Restart;
}
//check to see if any part ends with joiner
if (joiners.Any(s => part.ToUpper().EndsWith(s)))
{
//check if by ends with means that it is just a joiner
if (joiners.Any(s => part.ToUpper().Equals(s)))
{
continue;
}
else //name part ends with a joiner EX. Washington&
{
foreach (string div in joiners.Where(s => part.ToUpper().Contains(s))) // each string that contains a joiner
{
var temp = Regex.Split(part, "(" + div + ")").Where(x => x != String.Empty); // split into parts ignore leading or trailing spaces
int pos = list.IndexOf(part);
list.Remove(part);
for (int i = 0; i < temp.Count(); i++)
{
list.Insert(pos + i, temp.ElementAt(i));
}
parts = list.ToArray();
goto Restart;
}
}
}
}
if (parts.Count() == 0)
{
return;
}
if (joiners.Any(s => list.Last().ToUpper().Equals(s))) //remove last part if is a joiner
{
list.Remove(list.Last());
}
parts = list.ToArray(); // convert list back to array
}