4

「インデックスが配列の境界外でした」という例外を取り除く方法を探しています。以下のケース2の場合

目的: 名と姓を分離する (姓が null の場合もあります)

ケース 1:

本名:ジョン・メルウィック

自分のコードで最初のケースを解決できる

ケース 2:

名前:ケネディ

2 つの場合、コード内のLastNameでIndex was out of range というエラーが発生します

ケース 3:

本名:ルドルフ・ニック・ボザー

ケース 3 では、以下を取得できます。

FirstName: Rudolph and LastName: Nick (姓にするためには Nick Bother が必要です)

誰かが私を助けてくれたら、とても感謝しています。

コードは次のとおりです。

Match Names = Regex.Match(item[2], @"(((?<=Name:(\s)))(.{0,60})|((?<=Name:))(.{0,60}))", RegexOptions.IgnoreCase);

if (Names.Success)
{
    FirstName = Names.ToString().Trim().Split(' ')[0];                      
    LastName = Names.ToString().Trim().Split(' ')[1];
}
4

6 に答える 6

1

このようなものは動作します:

string name = "Mary Kay Jones" ;
Regex rxName = new Regex( @"^\s*(?<givenName>[^\s]*)(\s+(?<surname>.*))?\s*$") ;
Match m = rxName.Match( name ) ;

string givenName = m.Success ? m.Groups[ "givenName" ].Value : "" ;
string surname   = m.Success ? m.Groups[ "surname"   ].Value : "" ;

しかし、与えられた名前が 1 つの単語だけで構成されているというのは、非常に誤った仮定です。私は反対に多くの例を考えることができます.

  • ビリー・レイ (「ビリー・レイ・サイラス」の前の例のように)
  • メアリーケイ
  • メアリー・ベス

そして、本人に聞いてみないとわかりません。「Mary Beth Jones」は、名、ミドルネーム、姓で構成されていますか、それとも名、Mary Beth、姓「Jones」で構成されていますか.

英語圏の文化を検討している場合、通常の慣例では、多くの名前 (名) の後に姓 (姓) を付けることができます。たとえば、英国王室の相続人であるチャールズ皇太子は、かなり頑丈なチャールズ・フィリップ・アーサー・ジョージ・マウントバッテン・ウィンザーを運んでいます。厳密に言えば、彼には姓がありません。Mountbatten-Windsor は必要な場合に使用され、彼のフルネームは単に「Charles Phillip Arthur George」です。

于 2013-10-15T01:04:28.683 に答える
0
string fullName = "John Doe";
var names = fullName.Split(' ');
string firstName = names[0];
string lastName = names[1];

エラーが発生する理由は、名前の長さをチェックしていないためです。

names.Length == 0 //will not happen, even for empty string
names.Length == 1 //only first name provided (or blank)
names.Length == 2 //first and last names provided
names.Length > 2 //first item is the first name. last item is the last name. Everything else are middle names

詳細については、この回答を参照してください。

于 2013-10-14T23:54:05.090 に答える
0

これが、この問題に対する最も一般的な解決策です。

public class NameWrapper
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public NameWrapper()
    {
        this.FirstName = "";
        this.LastName = "";
    }
}
 public static NameWrapper SplitName(string inputStr, char splitChar)
   {
       NameWrapper w = new NameWrapper();
       string[] strArray = inputStr.Trim().Split(splitChar);
       if (string.IsNullOrEmpty(inputStr)){
           return w;
       }


       for (int i = 0; i < strArray.Length; i++)
       {
           if (i == 0)
           {
               w.FirstName = strArray[i];
           }
           else
           {
               w.LastName += strArray[i] + " ";
           }
       }
       w.LastName = w.LastName.Trim();

       return w;

   }
于 2015-01-29T08:09:47.073 に答える
0

使用する

String.indexof(" ")

string.lastindexof(" ")

それらが一致する場合、1 つのスペースがあります。一致しない場合は 0 を返すと思います。お役に立てれば

編集

インデックスを使用する場合、それらを使用して部分文字列を作成し、必要に応じて姓を取得できます

于 2013-10-14T23:54:05.887 に答える
0

コードを次のように変更します。

Match Names = Regex.Match(item[2], @"(((?<=Name:(\s)))(.{0,60})|((?<=Name:))(.{0,60}))", RegexOptions.IgnoreCase);

if (Names.Success)
{
  String[] nameParts =  Names.ToString().Trim().Split(' ');
  int count = 0;
  foreach (String part in nameParts) {
    if(count == 0) {
      FirstName = part;
      count++;
    } else {
      LastName += part + " ";
    }
  }
} 
于 2013-10-14T23:55:56.827 に答える