/// <summary>
        /// 解析婴儿
        /// </summary>
        /// <param name="pnrContentStr">pnr内容</param>
        /// <returns>婴儿集合</returns>
        protected List <MPnrMPassenger> GetBabys(string pnrContentStr)
        {
            List <MPnrMPassenger> babyPassengers = new List <MPnrMPassenger>();

            MatchCollection mats = Regex.Matches(pnrContentStr, @"\d{1,2}\.(OVF\/)?XN/IN/(?<NAME>.+)\s?INF\s?\([A-Z]{3}\d{2}\)/P(?<INDEX>\d{1,3})");

            foreach (Match mat in mats)
            {
                var passenger = new MPnrMPassenger();
                ////索引
                int indexNum;
                if (int.TryParse(mat.Groups["INDEX"].Value, out indexNum))
                {
                    passenger.SequenceNO = indexNum;
                }

                passenger.Name = mat.Groups["NAME"].Value;
                passenger.Type = PassengerType.婴儿;
                ////证件号
                passenger.CredID = this.GetBabyCredentialsCode(pnrContentStr, passenger.SequenceNO);
                //passenger.CardType = string.Empty;

                ////票号
                string settle;
                passenger.TicketCode = this.GetTeckitCode(pnrContentStr, passenger.SequenceNO, out settle, PassengerType.婴儿);
                passenger.SettleCode = settle;
                babyPassengers.Add(passenger);
            }

            return(babyPassengers);
        }
        /// <summary>
        /// 获得成人乘客
        /// </summary>
        /// <param name="pnrModel">pnrModel</param>
        /// <param name="pnrContentStr">pnrContentStr</param>
        /// <param name="isIgnoreError">是否忽略解析错误</param>
        /// <returns>乘客集合</returns>
        public List <MPnrMPassenger> GetAdultPassenger(MPnrContent pnrModel, string pnrContentStr, bool isIgnoreError)
        {
            string pnrCode;

            List <MPnrMPassenger> passengers = new List <MPnrMPassenger>();

            ////是否为团队票 PNR升位,DLF测试新加
            Match isTeam = Regex.Match(pnrContentStr, @"0\.(?<YDRS>\d{1,3}).{1,20}\sNM(?<SJRS>\d{1,3}) +(?<PNR>(\w{5,6}))");

            Match mat;

            if (isTeam.Success)
            {
                ////团队编码
                Regex reg = new Regex(@"(?<NAME>(?:1\.)(?:.|\n)+?)\s+\d{1,2}\. (?:\*| |[A-Z])", RegexOptions.IgnoreCase);
                mat = reg.Match(pnrContentStr);
                ////PNR
                pnrCode = isTeam.Groups["PNR"].Value;
                if (pnrModel != null)
                {
                    pnrModel.IsTeam = true;
                }
            }
            else
            {
                //// 散客编码PNR升位,DLF测试新加 2011-11-8 内容导入用户会把RT(PNR)这一行输入 导致编码中带有1的会被当做姓名内容匹配到
                Regex reg = new Regex(@"(?<NAME>(?:1?\.|0\.)(?:.|\n)+?) (?<PNR>(\w{5,6}))(?:/[A-Z0-9]{2})?\s+\d{1,2}\. ", RegexOptions.IgnoreCase);
                mat = reg.Match(pnrContentStr);
                if (!mat.Success)
                {
                    //// 解决pnr与名字之间没有空格的而导致不能匹配的问题
                    reg = new Regex(@"(?<NAME>(?:1?\.|0\.)(?:.|\n)+?)(?:| )(?<PNR>(\w{1,6}))(?:/[A-Z0-9]{2})?\s+\d{1,2}\. ", RegexOptions.IgnoreCase);
                    mat = reg.Match(pnrContentStr);
                }

                pnrCode = mat.Groups["PNR"].Value.Replace(" ", string.Empty);

                if (Regex.IsMatch(pnrCode, "[^A-Za-z0-9]"))
                {
                    System.Exception ex = new System.Exception("从PNR内容中获取乘客信息失败。");
                    throw ex;
                }

                ////编码换行特殊处理
                if (pnrCode.Trim().Length < 6)
                {
                    string nameStr = Regex.Replace(mat.Value.Trim(), "\n|\r", string.Empty);
                    mat     = reg.Match(nameStr + " ");////补空格
                    pnrCode = mat.Groups["PNR"].Value.Replace(" ", string.Empty);
                }
            }

            if (pnrModel != null)
            {
                pnrModel.Pnr = pnrCode;
            }
            if (!mat.Success && isIgnoreError == false)
            {
                System.Exception ex = new System.Exception("从PNR内容中获取乘客信息失败。");
                throw ex;
            }

            ////乘客姓名
            string passengerNames = Regex.Replace(mat.Groups["NAME"].Value, "\n|\r| \n| \r|\t", string.Empty).Trim();

            passengerNames = passengerNames + " ";
            ////如果名字后面没有空格,则直接加入空格。
            passengerNames = Regex.Replace(
                passengerNames,
                @"([A-Z|\u4e00-\u9fa5])(\d)",
                delegate(Match match)
            {
                return(match.Value.Insert(1, " "));
            });
            MatchCollection matches = Regex.Matches(
                passengerNames,
                @"(?:(?<NUM>\d{1,2})\.?)?(?<NAME>(?:[A-Z]{1,35}/([A-Z]| ){1,35})(?= |\d)|(?:(?:[\u2E80-\u9FFF]|[A-Z]){1,50}) )",
                RegexOptions.IgnoreCase);

            ////乘客编号
            int i = 1;
            ////最后一个乘机人NUM
            int lastIndex = 0;
            ////乘客类型
            PassengerType passengerType;
            ////证件类型
            string credentialsType;
            ////结算号
            string settle;
            ////乘客MODEL
            MPnrMPassenger passengerModel;

            ////是否有手机号
            //Regex regex = new Regex(@"\d{1,2}\.OSI (?<AIRCODE>\w{2}).+(?<PHONE>\d{11})");
            Regex regex = new Regex(@"\d{1,2}\.OSI (?<AIRCODE>\w{2}) CT[^\d]*(?<PHONE>\d{0,})(?:|/P\d{1,2})\s+");

            MatchCollection mats   = regex.Matches(pnrContentStr);
            string          mobile = string.Empty;

            if (mats.Count > 0)
            {
                foreach (Match m in mats)
                {
                    ////0开头被认为是座机,仍需补手机号
                    if (!m.Groups["PHONE"].Value.StartsWith("0") && m.Groups["PHONE"].Value.Trim().Length == 11)
                    {
                        mobile = m.Groups["PHONE"].Value;
                    }
                    else if (m.Groups["PHONE"].Value.Trim().Length == 0)
                    {
                        mobile = "13800000000"; //随便给一个号,客户端就会当做有手机号了 (配置有时提不出手机号)
                    }

                    ////获取到了正确的手机号
                    if (mobile.Length > 0 && !mobile.StartsWith("0"))
                    {
                        break;
                    }
                }
            }
            else
            {
                ////2011-10-17 只要有OSI CT就算补过手机号了
                regex = new Regex(@"\d{1,2}\.OSI CT");
                Match mm = regex.Match(pnrContentStr);
                if (mm.Success)
                {
                    mobile = "13800000000"; //随便给一个号,客户端就会当做有手机号了
                }
            }

            foreach (Match match in matches)
            {
                if (match.Groups["NAME"].Value.Trim().Length == 0)
                {
                    continue;
                }

                passengerModel            = new MPnrMPassenger();
                passengerModel.SequenceNO = i;
                ////乘客名
                passengerModel.Name = this.GetName(match.Groups["NAME"].Value.Trim(), out passengerType);
                passengerModel.Type = passengerType;
                ////证件
                passengerModel.CredID = this.GetCredentialsCode(pnrContentStr, passengerModel.SequenceNO, out credentialsType);
                //passengerModel.CardID = credentialsType;
                ////票号
                passengerModel.TicketCode = this.GetTeckitCode(pnrContentStr, passengerModel.SequenceNO, out settle, PassengerType.成人);
                passengerModel.SettleCode = settle;
                ////手机号
                passengerModel.MobileNo = mobile;
                ////添加乘客
                passengers.Add(passengerModel);
                i++;
                int.TryParse(match.Groups["NUM"].Value, out lastIndex);
            }

            if (lastIndex != 0 && lastIndex != passengers.Count)
            {
                System.Exception ex = new System.Exception("乘机人数解析异常,解析到的人数和实际人数不一致");
                throw ex;
            }

            if (passengers.Count == 0 && isIgnoreError == false)
            {
                System.Exception ex = new System.Exception("没有解析到任何乘机人");
                throw ex;
            }

            return(passengers);
        }