Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2019, 18:18   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Вытянуть два числа из строки

Здравствуйте.
Есть строки формата
'MDX (YD1) 2000 - 2006'
'RDX 2012 - До н.в.'
' купе (DC) 2001 - До н.в.'

Возможны варианты, в которых верхний предел не указан (модификация авто выпуска одного года, а не диапазона). Так же произвольный текст может отсутствовать.
Подстрока 'До н.в.' заменяется перманентно на 2017 (актуальность базы)

Таким образом я вижу три фрагмента: любой набор символов, первый год выпуска, последний год выпуска.

Мне нужно получить два числа, и не забывать что число может быть всего одно.
Из этих чисел формируется массив идущих по порядку годов, от и до. Если год один - то элемент массива один.
Пожалуй единственная проблема - то что в первой части может быть вообще любой набор символов, не поддающийся алгоритмизации, или "сливающийся" со второй и третьей частью, или вовсе отсутствовать. Но я надеюсь, что в процессе обработки это будут частные случаи.

У меня получилась реализация, заточенная под конкретные условия
Код:
private List<string> ProcessingModificationName(string modName)
{
	int
		yearLimit=1885, // так как я не знаю какой может быть минимальный год - указал первый в истории
		i=0,yearsCount=0; // индексаторы
	string[]
		years=new string[133], // поисковый словарь 2018-1885, с 1885 по 2017 включительно
		yearsExist=new string[2]; // именно два, если чисел будет больше - должна быть ошибка и частный случай
	List<string> result=new List<string>(); // массив для сохранения результатов
	modName=modName.Replace("До н.в.","2017");
	while (yearLimit<2018)
	{ // формирование поискового словаря
		years[i]=yearLimit.ToString();
		yearLimit++;
		i++;
	}
	for (i=0;i<years.Length;i++)
		if (modName.IndexOf(years[i])>-1)
		{
			yearsExist[yearsCount]=years[i];
			yearsCount++;
		}
	if (yearsCount==0)
		throw new InvalidDataException("Отсутствует год");
	if (yearsCount==1)
	{
		result.Add(yearsExist[0]);
		return result;
	}
	i=Convert.ToInt32(yearsExist[0]);
	yearLimit=Convert.ToInt32(yearsExist[1]);
	for (;i<=yearLimit;i++)
		result.Add(i.ToString());
	return result;
}
ВОПРОС в целях саморазвития
Как это можно реализовать более правильно ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 19.07.2019, 08:34   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

А регексами? А потом разделить по сепаратору и проверить левую и правую части на наличие числа.
"нв" предварительно можно заменить теми же самыми регексами на текущий год.
Изображения
Тип файла: jpg regex.jpg (20.8 Кб, 31 просмотров)
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 19.07.2019, 13:57   #3
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

WorldMaster, у меня всегда были проблемы с логикой построения регулярных выражений. Скажем так - я всегда обращался за помощью, потому что не могу вкурить, как их нужно строить.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 19.07.2019, 15:40   #4
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
WorldMaster, у меня всегда были проблемы с логикой построения регулярных выражений. Скажем так - я всегда обращался за помощью, потому что не могу вкурить, как их нужно строить.
у самого такая же фигня.. но вот задался тут целью раскурить и на самом деле там все достаточно просто. Там не так много маркеров базовых, но их возможностей вполне хватит для очень даже серьезных задач.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вытянуть программку vibraxo Помощь студентам 3 07.06.2013 23:16
Вытянуть текст с xml Jl6owa Общие вопросы Delphi 3 08.01.2012 03:50
Как вытянуть с DLE $tpl->set makar3000 PHP 2 02.07.2011 18:50
Вытянуть из тегов kschingiz C# (си шарп) 2 25.05.2011 16:14
вытянуть айпи megostudent Помощь студентам 1 20.02.2011 11:42