У меня есть текстовые файлы, отформатированные так:
R156484COMP_004A7001_20100104_065119.txt
Мне нужно последовательно извлекать R ****** COMP, номер 004A7001, 20100104 (дата), и мне не важно число 065119. проблема в том, что не ВСЕ анализируемые файлы имеют точное соглашение об именах. некоторые могут быть такими:
R168166CRIT_156B2075_SU2_20091223_123456.txt
или
R285476COMP_SU1_125A6025_20100407_123456.txt
Итак, как я могу использовать regex
вместо разделения, чтобы всегда получать этот серийный номер (например, 004A7001), дату (например, 20100104) и R ****** COMP (или CRIT) ???
Вот что я делаю сейчас, но он только форматирует файлы, как в моем первом примере.
if (file.Count(c => c == '_') != 3) continue;
и далее в коде у меня есть:
string RNumber = Path.GetFileNameWithoutExtension(file);
string RNumberE = RNumber.Split('_')[0];
string RNumberD = RNumber.Split('_')[1];
string RNumberDate = RNumber.Split('_')[2];
DateTime dateTime = DateTime.ParseExact(RNumberDate, "yyyyMMdd", Thread.CurrentThread.CurrentCulture);
string cmmDate = dateTime.ToString("dd-MMM-yyyy");
ОБНОВЛЕНИЕ: Это то, где я сейчас нахожусь, - я получаю ошибку, чтобы проанализировать RNumberDate для фактического формата даты. "Невозможно неявно преобразовать тип 'RegularExpressions.Match' в 'строку'
string RNumber = Path.GetFileNameWithoutExtension(file);
Match RNumberE = Regex.Match(RNumber, @"^(R|L)\d{6}(COMP|CRIT|TEST|SU[1-9])(?=_)", RegexOptions.IgnoreCase);
Match RNumberD = Regex.Match(RNumber, @"(?<=_)\d{3}[A-Z]\d{4}(?=_)", RegexOptions.IgnoreCase);
Match RNumberDate = Regex.Match(RNumber, @"(?<=_)\d{8}(?=_)", RegexOptions.IgnoreCase);
DateTime dateTime = DateTime.ParseExact(RNumberDate, "yyyyMMdd", Thread.CurrentThread.CurrentCulture);
string cmmDate = dateTime.ToString("dd-MMM-yyyy")