#c#
#c#
Вопрос:
myfinename_slice_1.tif
myfilename_slice_2.tif
...
...
myfilename_slice_15.tif
...
...
myfilename_slice_210.tif
В C #, как я могу получить индекс файла, например «1», «2», «15», «210» используя строковые операции?
Комментарии:
1. Опишите свои параметры. Всегда ли число встречается в конце имени файла, непосредственно перед расширением файла, после символа подчеркивания?
2. @micheal, да, число всегда появляется перед расширением и после среза_, но может быть 1 цифра или 2 или 3 цифры.
Ответ №1:
У вас есть несколько вариантов:
- Регулярные выражения с
Regex
классом; String.Split
.
Наиболее важным является то, какие предположения вы можете сделать о формате имени файла.
Например, если она всегда находится в конце имени файла, без учета расширения, и после подчеркивания, вы можете сделать:
var id = Path.GetFileNameWithoutExtension("myfinename_slice_1.tif")
.Split('_')
.Last();
Console.WriteLine(id);
Если, например, вы можете предположить, что идентификатор гарантированно отображается в имени файла, а символы [0-9]
могут отображаться в имени файла только как часть идентификатора, вы можете просто сделать:
var id = Regex.Match("myfinename_slice_1.tif", @"d ").Value;
Console.WriteLine(id);
Вероятно, есть больше способов сделать это, но самое главное — определить, какие предположения вы можете сделать, а затем закодировать реализацию на их основе.
Ответ №2:
Это похоже на задание для регулярных выражений. Сначала определите шаблон как регулярное выражение:
.*?_(?<index>d ).tif
Затем получаем совпадение с вашей строкой. Группа с именем index
будет содержать цифры:
var idx = Regex.Match(filename, @".*?_(?<index>d ).tif").Groups["index"].Value;
Ответ №3:
Вы можете использовать регулярное выражение "(?<digits>d ).[^.] $"
, и если оно совпадает, то искомая строка находится в группе с именем «цифры»
Ответ №4:
Вот метод, который будет обрабатывать это:
public int GetFileIndex(string argFilename) { возвращает Int32.Parse(argFilename.Подстрока (argFilename.lastIndexOf(«_») 1, argFilename.lastIndexOf(«.»))); }
Наслаждайтесь
Ответ №5:
String.Split('_')[2].Split('.')[0]
Ответ №6:
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var s1 = "myfinename_slice_1.tif";
var s2 = "myfilename_slice_2.tif";
var s3 = "myfilename_slice_15.tif";
var s4 = "myfilename_slice_210.tif";
var s5 = "myfilena44me_slice_210.tif";
var s6 = "7myfilena44me_slice_210.tif";
var s7 = "tif999";
Assert.AreEqual(1, EnumerateNumbers(s1).First());
Assert.AreEqual(2, EnumerateNumbers(s2).First());
Assert.AreEqual(15, EnumerateNumbers(s3).First());
Assert.AreEqual(210, EnumerateNumbers(s4).First());
Assert.AreEqual(210, EnumerateNumbers(s5).Skip(1).First());
Assert.AreEqual(210, EnumerateNumbers(s6).Skip(2).First());
Assert.AreEqual(44, EnumerateNumbers(s6).Skip(1).First());
Assert.AreEqual(999, EnumerateNumbers(s7).First());
}
static IEnumerable<int> EnumerateNumbers(string input)
{
var digits = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
string result = string.Empty;
foreach (var c in input.ToCharArray())
{
if (!digits.Contains(c))
{
if (!string.IsNullOrEmpty(result))
{
yield return int.Parse(result);
result = string.Empty;
}
}
else
{
result = c;
}
}
if (result.Length > 0)
yield return int.Parse(result);
}
}