我有以下类型的字符串文件路径:
const string s1 = "~/somestring/somestring/somestring/somestring/somestring/someName_987x3474.png";
const string s2 = "~/somestring/somestring/somestring/someOtherName_222x666.png";
const string s3 = "~/somestring/somestring/somestring/somestring/someName_9871x3474_someString.png";
现在我们已经有了一个正则表达式,它可以找到字符串s1和s2(987和222)的图像宽度。就是这样:
var regex = new Regex(@"(?i)[^/]*?(?<width>\d+)x\d+\..*$");
这个正确适用于前两个字符串,我可以稍后获得宽度。但它失败了第三个字符串。众所周知,路径将具有任何长度,并且具有以下格式的文件名:
someString_someNumberxsomeNumber.someextension 要么 someString_someNumberxsomeNumber_someString.someextension
目前我的正则表达式仅适用于第一种情况。
我后来做了这样的事情:
var v = filePaths.Select(f => regex.Match(f)).Where(m => (m.Success || !m.Success))
.Select(m => new MyClass
{
FileUrl = m.Value,
Width = int.Parse(m.Groups["width"].Value, CultureInfo.InvariantCulture),
})
.OrderBy(t => t.Width);
MyClass只包含两个属性FileUrl和Width。这里FileUrl或m.Value应该是文件的名称,即原始路径中的最后一个/之后的整个字符串,并且AxB中的宽度应为A.例如 - 987,222或9871。
感谢。
答案 0 :(得分:2)
看起来您可以使用Path.GetFileName
并在该结果上使用更简单的正则表达式:
var regex = new Regex(@"(?<width>\d+)x\d+");
var v = filePaths
.Select(f => regex.Match(Path.GetFileName(f)))
.Where(m => (m.Success || !m.Success))
.Select(m => new MyClass
{
FileUrl = m.Value,
Width = int.Parse(m.Groups["width"].Value, CultureInfo.InvariantCulture),
})
.OrderBy(t => t.Width);