【问题标题】:Extract Date from file name using Regex使用正则表达式从文件名中提取日期
【发布时间】:2018-11-18 11:01:33
【问题描述】:

我有以下名称结构:

GuidAsString/yyyy/MM/dd.zip

一个例子:

e1e2e854-e1cd-4980-83bb-2a0273f904aa/2018/11/18.zip

我想使用正则表达式提取日期。正则表达式不是我的事。

更新:我正在尝试做类似的事情:

DateTime dateTime = DateTime.ParseExact(name, format, formatprovider)

我正在寻找格式。如果你有更优雅的方式那就更好了。

感谢您的帮助。

【问题讨论】:

  • 文件名中怎么会有斜杠?
  • @KlausGütter 在我看来文件名是18.zip,而/2018/ + /11/ 只是子文件夹
  • @K.Dᴀᴠɪs:啊,是的,有道理
  • 对不起,我不准确。请忽略我写的文件名,并将其视为我需要从中提取日期的字符串。谢谢

标签: c# regex string datetime


【解决方案1】:
string input = @"e1e2e854-e1cd-4980-83bb-2a0273f904aa/2018/11/18.zip";
string pattern = @"/(\d+/\d+/\d+)";
var match = Regex.Match(input, pattern);
var date = DateTime.Parse(match.Groups[1].Value);
WriteLine(date.ToShortDateString());
// Prints: 18.11.2018

单线:

var date = DateTime.Parse(Regex.Match(@"e1e2e854-e1cd-4980-83bb-2a0273f904aa/2018/11/18.zip", @"/(\d+/\d+/\d+)").Groups[1].Value);

【讨论】:

  • 我正在尝试做类似的事情:DateTime dateTime = DateTime.ParseExact(name, format, formatprovider)。如果您能在此处向我提供格式,我将不胜感激:)
  • @AkramShahda 好吧,我的第一个代码(参见edited)分别提取年、月和时间。您可以随心所欲地使用它们。 :)
  • 谢谢,但我真正需要的是一个单行代码才能到达那里。
  • @AkramShahda 添加了单行字?
  • 由于文件名格式是固定的,使用三个捕获组不会比一个捕获所有然后必须再次解析日期更好吗?
【解决方案2】:

您可以使用正则表达式提取字符串格式的日期:

var st = "e1e2e854-e1cd-4980-83bb-2a0273f904aa/2018/11/18.zip";
var st1 = Regex.Match(st,@"\d{4}/\d{2}/\d{2}").Value;

st1 = "2018/11/18" 如果要转换为日期格式,请使用:

var date = DateTime.Parse(st1);

【讨论】:

  • 我正在尝试做类似的事情:DateTime dateTime = DateTime.ParseExact(name, format, formatprovider)。如果您能在此处向我提供格式,我将不胜感激:)
  • 为什么不使用"/(\\d+)/(\\d+)/(\\d+)",然后分别使用三个捕获的组来与原生 con 建立一个日期。为什么要再次解析日期来分隔三个字段?
【解决方案3】:

您可以通过一些字符串操作轻松找到解决方案。您可以使用String.Split 之类的方法;

var str = "e1e2e854-e1cd-4980-83bb-2a0273f904aa/2018/11/18.zip";
var year = str.Split('/')[1];
var month = str.Split('/')[2];
var day = str.Split('/')[3].Split('.')[0];

你可以像这样解析你的部分;

var myDate = DateTime.ParseExact($"{year}{day}{month}",
                                  "yyyyddMM",
                                  CultureInfo.InvariantCulture);

【讨论】:

  • 谢谢,但你不觉得代码太多就只是为了一个简单的目的吗?
  • @AkramShahda 您不需要 正则表达式。只使用简单的字符串操作。毕竟,这不是昂贵的操作。这只是 5 行代码。真的太多了吗?您不认为它比正则表达式更具可读性吗?你的选择..
  • @SonerGönül,为什么不使用正则表达式呢?您是否认为使用简单的字符串操作(至少每个都需要一次遍历数据)会比一次完成所有操作要好?你真的认为在同一个String 上使用.split() 三次会比一次获得三个字段更有效吗?你知道还有比使用.split()更多的东西???
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
相关资源
最近更新 更多