[英]Regex Match substring in middle of string
我需要幫助完成正則表達式。 我有以下正則表達式:/(?i)encntr(?-i)/gi
https://regex101.com/r/t4pUkr/1/
我有以下三個文件名:
我上面的正則表達式匹配所有 3 個,但我只希望它匹配第一個要點。 所以我試圖使用 ^(not) 運算符來實現這一點,但我沒有得到任何地方。 忽略上一句,我對使用 ^ 的理解是錯誤的。 此外,如果我可以在不依賴於 - 和 . encntr、encntrprov 和 encntrlocation 被包裹在里面。我不創作這些文件,也不能保證作者遵循命名約定。 因此我不能保證 - 和 . 將永遠在那里。
可能的其他文件名示例:
使用這個正則表達式的目的是從我的代碼中刪除內部 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.