Мне нужна помощь в заполнении выражения регулярного выражения. У меня есть следующее регулярное выражение: / (? I) encntr (? - i) / gi
https://regex101.com/r/t4pUkr/1/
У меня есть следующие три имени файла:
- 20200207050000-20200207162558-encntr.txt - должен совпадать с использованием encntr
- 20200207050000-20200207162558-encntrprov.txt - НЕ должен совпадать с использованием encntr
- 20200207050000-20200207162558t encntr - НЕ ДОЛЖЕН совпадать с использованием encntr
Мое вышеупомянутое регулярное выражение соответствует всем 3, но я хочу, чтобы оно совпадало только с первой точкой маркера. Поэтому я пытаюсь использовать оператор ^ (not) для достичь этого, но я никуда не доберусь. Не обращайте внимания на предыдущее предложение, мое понимание использования ^ было плохо информировано. Кроме того, было бы более надежным, если бы я мог сделать это без зависимости от - и. что encntr, encntrprov и encntrlocation обернуты. Я не являюсь автором файлов и не могу гарантировать, что автор следует соглашению об именах. Таким образом, я не могу не гарантировать - и. всегда будет там.
Пример возможных других имен файлов:
- 20200207050000-20200207162558encntr.txt - должен совпадать с использованием encntr
- 20200207050000-20200207162558encntr01.txt - должен сопоставить с помощью encntr
- 20200207050000-20200207162558_encntr_.txt - следует сопоставить с помощью encntr
- 20200207050000-20200207162558 ^ encntr ^ .txt - сопоставить с использованием encntr
- 202002070500r58Fn16161625201616 должно совпадать с использованием encntr
Смысл использования этого регулярного выражения заключается в удалении внутреннего оператора if из моего кода. Я перебираю значения enum и проверяю, присутствует ли значение enum во входящем имени файла.
Прямо сейчас код использует txtFilename.Contains (возможный идентификатор, StringComparison.OrdinalIgnoreCase)), чтобы увидеть, содержит ли входящее имя файла одно из значений перечисления. Но в случае enum encntr метод Contains возвращает true для encntr, encntrprov и имени файла encntrlocation. Поэтому я должен сделать дополнительную проверку, чтобы выяснить, какая это. Я хочу использовать регулярное выражение для сопоставления только с encntr, encntrprov или encntrlocation, указав эти значения в регулярном выражении. Таким образом, encntr не может совпадать с encntrprov или encntrlocation с использованием регулярного выражения.
Вот фрагмент кода, который я пытаюсь обновить.
public static FilenameIdentifierEnum IdentifyFile(string txtFilename)
{
FilenameIdentifierEnum identifier = FilenameIdentifierEnum.unassigned;
foreach (FilenameIdentifierEnum possibleIdentifier in Enum.GetValues(typeof(FilenameIdentifierEnum)))
{
// I would like this Regex.Match to eliminate the need to have the inner if statements
//if(Regex.IsMatch(txtFilename, $"(?i){possibleIdentifier.ToString()}(?-i)", RegexOptions.IgnoreCase))
if (txtFilename.Contains(possibleIdentifierLower, StringComparison.OrdinalIgnoreCase))
{
identifier = possibleIdentifier;
if (identifier == FilenameIdentifierEnum.encntr)
identifier = EncntrCaseChecking(txtFilename, identifier);
if (identifier == FilenameIdentifierEnum.appt)
identifier = ApptCaseChecking(txtFilename, identifier);
break;
}
}
if (identifier == FilenameIdentifierEnum.unassigned)
{
throw new UnknownFileException($"Unknown identifier in filename or no file identifier in filename found. Text Filename: {txtFilename}");
}
return identifier;
}
private static FilenameIdentifierEnum EncntrCaseChecking(string txtFilename, FilenameIdentifierEnum possibleIdentifier)
{
possibleIdentifier = (txtFilename.Contains(FilenameIdentifierEnum.encntrloc.ToString(), StringComparison.OrdinalIgnoreCase)
? FilenameIdentifierEnum.encntrloc
: possibleIdentifier);
possibleIdentifier = (txtFilename.Contains(FilenameIdentifierEnum.encntrprov.ToString(), StringComparison.OrdinalIgnoreCase)
? FilenameIdentifierEnum.encntrprov
: possibleIdentifier);
return possibleIdentifier;
}
private static FilenameIdentifierEnum ApptCaseChecking(string txtFilenameLower, FilenameIdentifierEnum possibleIdentifier)
{
return (txtFilenameLower.Contains(FilenameIdentifierEnum.apptpart.ToString(), StringComparison.OrdinalIgnoreCase)
? FilenameIdentifierEnum.apptpart
: possibleIdentifier);
}
public enum FilenameIdentifierEnum
{
unassigned,
encntr,
encntrprov,
encntrloc,
persondemo,
personbenefitcoverage,
personprov,
medication,
immunization,
allergy,
diagnosis,
problem,
labresults,
socialhistory,
vitals,
procedures,
appt,
apptpart,
appointments,
appointmentparticipant,
encounterlocation,
result
}
Спасибо за вашу помощь.