使用正则表达式在文件中查找日期字符串

时间:2016-01-18 20:24:46

标签: c# regex

我需要在文本文件中找到特定的日期字符串。目前文件中有两个日期字符串 - “截止日期:2016年1月26日”和“日期:01/252016”。我需要找到第二个,但我目前的代码只找到第一个。我猜测正则表达式是一个更好的实现,但不知道如何编写代码。

当前代码 -

searchString = "Date:";
if (fileContents.IndexOf(searchString) > 0)
{
    string tmp = fileContents.Substring(fileContents.IndexOf(searchString) + searchString.Length).Trim();
    string loan_date = tmp.Substring(0, tmp.IndexOf('\r')).Trim();
    if (loan_date.Count(x => x == '/') == 1)
    {
        StringBuilder sb = new StringBuilder(loan_date);
        sb[sb.Length - 4] = '/';
        loan_date = sb.ToString();
    }
    DateTime dt = DateTime.ParseExact(loan_date, "M/d/yyyy", System.Globalization.CultureInfo.InvariantCulture);
    return dt;
}

2 个答案:

答案 0 :(得分:1)

在C#中,您可以通过执行以下操作找到正则表达式的匹配项。

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = "[0-1]?[0-9]/[0-9]{2}/[0-9]{4}";
        string input = "Due Date: 01/26/2016 Date: 01/25/2016";

        foreach (var m in Regex.Matches(input, pattern)) {
            Console.WriteLine("'{0}' found at index {1}.", 
                       m.Value, m.Index);
        }
    }
}

该正则表达式具体表示0或1(可选)后跟一个数字,后跟斜杠,后跟两位数字,后跟斜杠,后跟四位数。

我还假设你的第二个日期01/252016包含一个拼写错误。

答案 1 :(得分:0)

试试这个正则表达式:

(Due\s)?(Date:)\s([0-1][0-2])\/([0-3][0-9])\/([0-2][0-9]{3})

由于两个字符串都包含“Date”,我们可以使用它来进一步过滤掉其他字符串(您可能实际上并不想要所有日期)。由于Due是可选的,我们可以将其标记为可选。过滤掉格式不佳的日期有点困难,但你可以限制一些事情(就像我上面的那样)。您必须单独验证日期才能确定。

只要格式正确,这是一个不关心检查的正则表达式:

(Due\s)?(Date:)\s([0-9]{2})\/([0-9]{2})\/([0-9]{4})

或只是日期:

([0-9]{2})\/([0-9]{2})\/([0-9]{4})