[英]Extract version from filename
這是我的示例文件名Text_2.23.txt
我已經分離了擴展名但我無法獲取版本,因此我可以稍后在代碼中使用它進行比較。 我需要得到2.23
,
編輯:文件名可以有多種形式,但版本總是在文件名的末尾。
string s = f1.Name.ToString(); //for the Filename
int k = s.LastIndexOf('.');
string lhs = k < 0 ? s : s.Substring(0, k),
rhs = k < 0 ? "" : s.Substring(k + 1);
char[] array = lhs.ToCharArray();
Array.Reverse(array); // reverse search from right to left
for (int j = 0; j < array.Length; j++)
{
char letter = array[j]; //the letter I get out in the sample case is "3"
}
使用Path
和Version
類:
string fileName = "Text_2.23.txt";
string fn = Path.GetFileNameWithoutExtension(fileName);
string[] parts = fn.Split('_');
Version v;
if (parts.Length > 1 && Version.TryParse(parts.Last(), out v))
{
Console.Write("Major:{0}, Minor:{1}", v.Major, v.Minor);
}
編輯:因為您已經評論過您的文件名幾乎可以是任意的,但是版本總是在最后,您只需要那個string
。
使用您評論的示例:
string[] fileNames = new[] { "teext_023.ext", "txtxt.x9.08.ext", "text0911.ext" };
string[] versions = fileNames
.Select(fileName =>
Path.GetFileNameWithoutExtension(fileName).Split('_')
.Last()
.Reverse()
.TakeWhile(c => c == '.' || Char.IsDigit(c))
.Reverse()
).Select(chars => new string(chars.ToArray())).ToArray();
這就是我一直在尋找的解決問題的簡單方法:
Array.Reverse(array);
Boolean dot = false;
for (int j = 0; j < array.Length; j++)
{
char letter = array[j];
if (char.IsNumber(letter))
{
version += letter.ToString();
}
else if (letter == '.')
{
if (dot)
{
break;
}
dot = true;
}
}
version = this.Reverse(version);
if (version.Equals(""))
{
version = "0";
}
下面是一些使用正則表達式 (Regex) 從字符串中提取版本號的通用解決方案。
正則表達式解釋(\d+\.\d+\.\d+\.\d+)
:
(
開始第一個捕獲組\d
匹配一個數字(相當於[0-9])+
在一次和無限次之間匹配前一個令牌,盡可能多次,根據需要回饋(貪婪)\.
匹配字符.
字面意思(區分大小寫))
關閉第一個捕獲組因此,對於通常使用格式XXXX
的版本號,只需根據需要多次重復 Regex 模式,以獲得您感興趣的版本號組件的數量。
(\d+\.\d+)
/// <summary>
/// Extracts a version from the given input.
/// </summary>
/// <param name="input">
/// String that may contain a valid 4-component version in the format X.X.X.X.
/// <para>
/// e.g. 1.0.0.0 or 0.0.17.95
/// </para>
/// </param>
/// <returns>Version or null.</returns>
public string ExtractVersionNumber(string input)
{
var regex = new Regex(@"(\d+\.\d+\.\d+\.\d+)");
var match = regex.Match(input);
return match.Success ? match.Value : null;
}
/// <summary>
/// Extracts a version number from the given input.
/// </summary>
/// <param name="input">
/// String that may contain a valid version.
/// <para>
/// e.g. 1.0.0.0 or 0.0.17.95
/// </para>
/// </param>
/// <param name="requireBuild">
/// Indicates whether the build component of the version is required.
/// <para>
/// e.g. 1.0.0 or 0.0.17
/// </para>
/// </param>
/// <param name="requireRevision">
/// Indicates whether the revision component of the version is required.
/// <para>
/// e.g. 1.0.0.0 or 0.0.17.95
/// </para>
/// </param>
/// <returns>Version or null.</returns>
public string ExtractVersionNumber(string input, bool requireBuild = true, bool requireRevision = true)
{
var pattern = @"\d+\.\d+";
if (requireBuild)
{
pattern += @"\.\d+";
}
if (requireRevision)
{
pattern += @"\.\d+";
}
var regex = new Regex($"({pattern})");
var match = regex.Match(input);
return match.Success ? match.Value : null;
}
/// <summary>
/// Extracts a version from the given input.
/// </summary>
/// <param name="input">
/// String that may contain a valid version number.
/// </param>
/// <param name="componentsRequired">
/// Number of version components required. Defaults to 4.
/// <para>Valid values: 4, 3, 2.</para>
/// <para>4 components example: 1.0.0.0 or 0.1.17.95</para>
/// <para>3 components example: 1.0.0 or 0.1.17</para>
/// <para>2 components example: 1.0 or 0.1</para>
/// </param>
/// <returns>Version or null.</returns>
public string ExtractVersionNumber(string input, int componentsRequired = 4)
{
string pattern;
switch (componentsRequired)
{
case 4:
pattern = @"(\d+\.\d+\.\d+\.\d+)";
break;
case 3:
pattern = @"(\d+\.\d+\.\d+)";
break;
case 2:
pattern = @"(\d+\.\d+)";
break;
default:
throw new ArgumentOutOfRangeException(nameof(componentsRequired), "Valid values: 4, 3, 2");
}
var regex = new Regex(pattern);
var match = regex.Match(input);
return match.Success ? match.Value : null;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.