【问题标题】:How to extract name from a file name in the form "<name>_<fileNum>of<fileNumTotal>" or "<name>"?如何从“<name>_<fileNum>of<fileNumTotal>”或“<name>”形式的文件名中提取名称?
【发布时间】:2022-01-13 16:13:18
【问题描述】:

用户指定的文件名可以是“_of”或简单的“”形式。我需要以某种方式从完整文件名中提取“”部分。

基本上,我正在寻找以下示例中“ExtractName()”方法的解决方案:

string fileName = "example_File";  \\ This var is specified by user
string extractedName = ExtractName(fileName);  // Must return "example_File"
fileName = "example_File2_1of5";
extractedName = ExtractName(fileName);  // Must return "example_File2"
fileName = "examp_File_3of15";
extractedName = ExtractName(fileName);  // Must return "examp_File"
fileName = "example_12of15";
extractedName = ExtractName(fileName);  // Must return "example"

编辑:这是我迄今为止尝试过的:

ExtractName(string fullName)
{
    return fullName.SubString(0, fullName.LastIndexOf('_'));
}

但这显然不适用于全名只是“”的情况。

谢谢

【问题讨论】:

  • 你试过什么?你能发布你的失败尝试吗?
  • 我已经在帖子中添加了我已经尝试过的内容。但它显然不适用于全名只是名称本身的情况。
  • 我想你在这里需要一些正则表达式。我很讨厌正则表达式,但我认为 _\d 应该给你你想要修剪的位的位置

标签: c# visual-studio file


【解决方案1】:

使用正则表达式会更容易解析,因为您不知道每个数字有多少位数。

var inputs = new[]
{
    "example_File",
    "example_File2_1of5",
    "examp_File_3of15",
    "example_12of15"
};

var pattern = new Regex(@"^(.+)(_\d+of\d+)$");
foreach (var input in inputs)
{
    var match = pattern.Match(input);
    if (!match.Success)
    {
        // file doesn't end with "#of#", so use the whole input
        Console.WriteLine(input);
    }
    else
    {
        // it does end with "#of#", so use the first capture group
        Console.WriteLine(match.Groups[1].Value);
    }
}

此代码returns

example_File
example_File2
examp_File
example

Regex 模式包含三个部分:

  1. ^$ 是锚点,可确保您捕获整个字符串,而不仅仅是字符的子集。
  2. (.+) - 匹配一切,尽可能贪婪。
  3. (_\d+of\d+) - 匹配“_#of#”,其中“#”可以是任意数量的连续数字。

【讨论】:

  • 谢谢你,这很完美!
  • 小观察:_\d+of\d+ 不需要放在括号中,因为我们不需要 AFAICS 捕获它
  • 没错,我只是出于习惯把它这样包裹起来。将来也可以修改正则表达式以捕获各个数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多