保存文件名时移除指定内容的技术求助:截取首个下划线前文本
解决方案:统一提取文件名第一个下划线前的内容
我明白你的问题了——你需要处理两种文件名场景:要么移除_zm后缀,要么只保留第一个下划线之前的内容,而之前的Replace方法只能覆盖第一种情况,没法处理像ak47_fmg_mp这类多下划线的文件名。其实我们可以把这两种需求合并成一个逻辑:提取文件名中第一个下划线之前的部分,这样不管是m14_zm还是ak47_fmg_mp,都能得到你想要的结果。
这里提供两种可靠的实现方法:
方法一:字符串分割法(简单直观)
这种方法直接通过查找第一个下划线的位置来截取内容,不需要依赖正则,代码更易懂:
string filename = nyu_res.filename; string result; // 找到第一个下划线的索引位置 int firstUnderscorePos = filename.IndexOf('_'); if (firstUnderscorePos != -1) { // 截取从开头到第一个下划线之前的子串 result = filename.Substring(0, firstUnderscorePos); } else { // 如果文件名中没有下划线,直接保留原文件名 result = filename; }
逻辑说明:
IndexOf('_')会返回第一个下划线在字符串中的位置,如果没有下划线则返回-1- 当存在下划线时,用
Substring(0, firstUnderscorePos)截取开头到下划线前的内容;不存在则直接用原文件名
方法二:正则表达式法(灵活通用)
如果你更倾向于用正则,这里给出正确的正则表达式,匹配开头到第一个下划线前的所有字符:
using System.Text.RegularExpressions; string filename = nyu_res.filename; string result; // 正则规则:匹配从开头到第一个下划线之前的所有非下划线字符 Match matchResult = Regex.Match(filename, @"^[^_]+"); if (matchResult.Success) { result = matchResult.Value; } else { result = filename; }
正则规则解释:
^:匹配字符串的起始位置[^_]+:匹配任意不是下划线的字符,至少出现一次(+表示贪婪匹配,直到遇到第一个下划线为止)
这两种方法都能完美覆盖你的需求:
- 对于
m14_zm,会返回m14 - 对于
ak47_fmg_mp,会返回ak47 - 对于没有下划线的文件名(比如
m4a1),会直接返回原文件名
内容的提问来源于stack exchange,提问作者elfenliedtopfan5
相关产品推荐
相关产品推荐

