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