簡體   English   中英

正則表達式匹配字符串中間的子字符串

[英]Regex Match substring in middle of string

我需要幫助完成正則表達式。 我有以下正則表達式:/(?i)encntr(?-i)/gi

https://regex101.com/r/t4pUkr/1/

我有以下三個文件名:

  • 20200207050000-20200207162558-encntr.txt - 應該使用 encntr 匹配
  • 20200207050000-20200207162558-encntrprov.txt - 不應該使用 encntr 匹配
  • 20200207050000-20200207162558-encntrlocation.txt - 不應該使用 encntr 匹配

我上面的正則表達式匹配所有 3 個,但我只希望它匹配第一個要點。 所以我試圖使用 ^(not) 運算符來實現這一點,但我沒有得到任何地方。 忽略上一句,我對使用 ^ 的理解是錯誤的。 此外,如果我可以在不依賴於 - 和 . encntr、encntrprov 和 encntrlocation 被包裹在里面。我不創作這些文件,也不能保證作者遵循命名約定。 因此我不能保證 - 和 . 將永遠在那里。

可能的其他文件名示例:

  • 20200207050000-20200207162558encntr.txt - 應該使用 encntr 匹配
  • 20200207050000-20200207162558encntr01.txt - 應該使用 encntr 匹配
  • 20200207050000-20200207162558_encntr_.txt - 應該使用 encntr 匹配
  • 20200207050000-20200207162558^encntr^.txt - 應該使用 encntr 匹配
  • 20200207050000-20200207162558FinalencntrUploaded.txt - 應該使用 encntr 匹配

使用這個正則表達式的目的是從我的代碼中刪除內部 if 語句。 我正在迭代枚舉值並檢查傳入文件名中是否存在枚舉值。

現在代碼使用 txtFilename.Contains(possibleIdentifierLower, StringComparison.OrdinalIgnoreCase)) 來查看傳入的文件名是否包含枚舉值之一。 但是對於 enum encntr,Contains 方法為 encntr、encntrprov 和 encntrlocation 文件名返回 true。 所以我必須做額外的檢查,以確定它是哪一個。 我想通過在正則表達式中提供這些值來利用正則表達式僅匹配 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
}

感謝您的幫助。

使用這個正則表達式:

(encntr\..*?)

與子字符串encntr.匹配encntr. 只要。

請注意, ^不是(非)運算符。 ^用於從字符串的開頭進行匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM