Подстрока соответствия регулярного выражения в середине строки - PullRequest
0 голосов
/ 31 марта 2020

Мне нужна помощь в заполнении выражения регулярного выражения. У меня есть следующее регулярное выражение: / (? 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
}

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 31 марта 2020

Используйте это регулярное выражение:

(encntr\..*?)

Соответствует только подстроке encntr..

Обратите внимание, что ^ не является (не) оператором. ^ для сопоставления с начала строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...