如何无需while循环用正则表达式提取文件名中的abc前缀
解决方法
方案1:正则替换(推荐)
直接通过正则一次性移除文件名末尾所有的X、Y、XY或YX组合,无需循环即可得到abc部分:
string abc = Regex.Replace(fileName, @"(XY|YX|X|Y)*$", "");
提示:请将正则中的X和Y替换为你实际的特定模式字符串。比如若X是"_v\d+"、Y是"_beta",则正则需改为@"(_v\d+_beta|_beta_v\d+|_v\d+|_beta)*$"——务必把长组合(如XY、YX)放在单个X/Y前面,避免将组合拆分为单个匹配。
方案2:单个正则捕获
如果需要用捕获组直接提取abc,可以用分支正则覆盖所有格式场景:
Match match = Regex.Match(fileName, @"^(.*?)(?:XY|YX|X|Y)$|^(.*)$"); string abc = match.Groups[1].Success ? match.Groups[1].Value : match.Groups[2].Value;
这个正则会优先匹配带后缀的文件名(通过捕获组1获取abc),若匹配失败则匹配纯abc格式(通过捕获组2获取abc)。
之前尝试失效的原因
- 使用
(.*)(X|Y)这类正则时,贪婪模式的.*会尽可能多匹配字符,导致abcXY被拆分为abcX(组1)和Y(组2),无法直接得到abc; - 正向预查方案仅针对
abcXY和abcYX设计,没有覆盖纯abc、abcX、abcY的场景,适用性受限。
内容的提问来源于stack exchange,提问作者Drew P
相关产品推荐
相关产品推荐

