コード例 #1
0
        /// <summary>
        /// Очищает и возвращает варианты AddressObject номера здания/сооружения и AddressObject номера помещения.
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        internal List <Variant> TruncBuildingAndRoomNum(ref string source)
        {
            List <Variant> variants = new List <Variant>();

            AddressObject buildingAO = null;
            AddressObject roomAO     = null;

            int buildingIndex = -1;

            //парсим строение по 8 паттерну(по словарю)
            source = regexGroup.Replace(buildingLitterPattern, source, "");
            if (regexGroup.GetMatch(@"[0-9]+\/[0-9]+", source).Success)
            {
                source = regexGroup.Replace("(?<=[0-9]+)[^а-я0-9]*стр[^а-я0-9]*[0-9]+", source, "");
            }
            else
            {
                source = regexGroup.Replace("(?<=[0-9]+)[^а-я0-9]*стр[^а-я0-9]*(?=[0-9]+)", source, "/");
            }

            var numberSc = regexGroup.GetMatch("[0-9]+ [а-я]+(а|я)([^а-я]|$)", source);

            var building = regexGroup.GetInnerMatch(fullHouseTypesPattern, houseTypesMultiPattern, source);

            if (building != null)
            {
                source = source.Remove(building.outer.Index, building.outer.Length);
                string buildingName = building.outer.Value.Remove(building.inner.Index, building.inner.Length);
                buildingIndex = building.outer.Index;

                string buildingTypeName = building.inner.Value;
                var    houseType        = typeDictionary.GetAOType(new TypeKey()
                {
                    abbreviatedName = buildingTypeName,
                    level           = (int)ObjectLevel.House
                });

                string housing = StringHelper.GetLettersOrNumbersAfterSlash(buildingName, out int firstIndexHousing, out int lengthHousing);

                if (housing != "")
                {
                    //у нас есть корпус!!!
                    var    newVar = new Variant();
                    string name   = StringHelper.GetOnlyDigitsAndLetters(buildingName.Remove(firstIndexHousing, lengthHousing).Replace("/", ""));
                    newVar.Add(new AddressObject(name, houseType), -1);
                    variants.Add(newVar);
                }
                buildingAO = new AddressObject(StringHelper.GetOnlyDigitsAndLetters(buildingName), houseType);
            }


            //парсим помещение по 9 паттерну(по словарю)
            var room = regexGroup.GetInnerMatch(fullRoomTypesPattern, roomTypesMultiPattern, source);

            if (room != null)
            {
                source = source.Remove(room.outer.Index, room.outer.Length);
                string roomName = room.outer.Value.Remove(room.inner.Index, room.inner.Length);

                string roomType = room.inner.Value;
                roomAO = new AddressObject(StringHelper.GetOnlyDigitsAndLetters(roomName), typeDictionary.GetAOType(new TypeKey()
                {
                    abbreviatedName = roomType, level = (int)ObjectLevel.Room
                }));
            }

            //ищем дом по патерну 7:(ул|ш)[^а-я]*[0-9]+

            if (buildingAO == null)
            {
                var  housePredict  = regexGroup.GetMatch(housePredictPattern, source);
                bool notInNumberSc = !(housePredict.Index >= numberSc.Index && housePredict.Index + housePredict.Length <= numberSc.Index + numberSc.Length);
                if (housePredict.Success && notInNumberSc)
                {
                    source        = source.Remove(housePredict.Index, housePredict.Length);
                    buildingIndex = housePredict.Index;

                    var houseType = new AddressObjectType(null, null, (int)ObjectLevel.House);

                    string housing = StringHelper.GetLettersOrNumbersAfterSlash(housePredict.Value, out int firstIndexHousing, out int lengthHousing);
                    if (housing != "")
                    {
                        //у нас есть корпус!!!
                        var    newVar = new Variant();
                        string name   = StringHelper.GetOnlyDigitsAndLetters(housePredict.Value.Remove(firstIndexHousing, lengthHousing).Replace("/", ""));
                        newVar.Add(new AddressObject(name, houseType), -1);
                        variants.Add(newVar);
                    }

                    buildingAO = new AddressObject(StringHelper.GetOnlyDigitsAndLetters(housePredict.Value), houseType);
                }
            }

            //если по паттернам не получилось, то просто берём самое последнее число;
            if (buildingAO == null)
            {
                var anyNumber = regexGroup.GetMatches(simpleHousePattern, source);

                if (anyNumber.Count > 0)
                {
                    var  lastNumber    = anyNumber[anyNumber.Count - 1];
                    bool notInNumberSc = !(lastNumber.Index >= numberSc.Index && lastNumber.Index + lastNumber.Length <= numberSc.Index + numberSc.Length);

                    if (notInNumberSc)
                    {
                        source        = source.Remove(lastNumber.Index, lastNumber.Length);
                        buildingIndex = lastNumber.Index;
                        buildingAO    = new AddressObject(lastNumber.Value, new AddressObjectType(null, null, (int)ObjectLevel.House));
                    }
                }
            }

            //проверяем корпус  цифру
            bool housingAdded  = false;
            var  housingNumber = regexGroup.GetInnerMatch(housingNumberPattern, "[0-9]+", source);

            if (buildingAO != null && housingNumber != null)
            {
                source = source.Remove(housingNumber.outer.Index, housingNumber.outer.Length);

                var buildingWithHousing = new Variant();
                buildingWithHousing.Add(new AddressObject(buildingAO.Name + "/" + housingNumber.inner.Value,
                                                          new AddressObjectType(null, "дом с корпусом", (int)ObjectLevel.House)), 3);
                buildingWithHousing.Add(roomAO);
                variants.Add(buildingWithHousing);

                if (roomAO == null)
                {
                    var housingAsRoom = new Variant();
                    housingAsRoom.Add(buildingAO);
                    housingAsRoom.Add(new AddressObject(housingNumber.inner.Value, new AddressObjectType(null, null, (int)ObjectLevel.Room)), 2);
                    variants.Add(housingAsRoom);
                    housingAdded = true;
                }
            }

            //проверяем корпус букву
            var housingLitter = regexGroup.GetMatch(housingLitterPattern, source);

            if (housingLitter.Success)
            {
                source = source.Remove(housingLitter.Index, housingLitter.Length);

                var buildingWithLitter = new Variant();
                buildingWithLitter.Add(new AddressObject
                                           (buildingAO.Name + housingLitter.Value[housingLitter.Value.Length - 1],
                                           new AddressObjectType(null, "дом с корпусом", (int)ObjectLevel.House)), 3);
                buildingWithLitter.Add(roomAO);
                variants.Add(buildingWithLitter);
            }


            if (!housingAdded)
            {
                var defVar = new Variant();
                defVar.Add(buildingAO);
                defVar.Add(roomAO);
                variants.Add(defVar);
            }

            if (buildingIndex != -1 && buildingIndex < source.Length - 1)
            {
                source = source.Remove(buildingIndex);
            }

            return(variants);
        }