-1

我有一些带有 DateTime 的字符串,有些没有。我必须找出每个字符串是否包含 DateTime。

请帮帮我。

字符串示例(俄语):

13 сентября 2013 г., 11:27 пользователь  <support@example.com> написал:

13 сентября 2013 г., 11:29 пользователь Вячеслав Равдин <someone@example.com> написал:

13.09.2013, в 11:27, support@example.com написал(а):
4

3 回答 3

1

您需要Regex为每个要识别的模式创建一个,然后将字符串与每个Regex匹配,直到您找到匹配项或直到您尝试了所有Regexes。

public bool TryParseDate(string input, out DateTime result)
{
    if (MatchPattern1(input, result))
    {
       return true;
    }
    if (MatchPattern2(input, result)) 
    {
       return true;
    }
    ...
    return false;
}

其中MatchPattern每个方法都查找特定的正则表达式:

private bool MatchPattern1(string input, out DateTime result)
{
    Match match = Regex.Match(input, @"*pattern here*");
    if (match.Success)
    {
        result = *build date based on matches*;
        return true;
    }
    return false;
}

这样,您可以随心所欲地进行匹配(使用或不使用正则表达式),并使它们变得尽可能复杂。

于 2013-09-13T09:08:18.737 回答
1

您可以使用DateTime.TryParseExact俄罗斯文化和正确的格式字符串。

string russianLines = @"
13 сентября 2013 г., 11:27 пользователь написал:
13 сентября 2013 г., 11:29 пользователь Вячеслав Равдин написал:
13.09.2013, в 11:27, blablahblah...";

CultureInfo ruCult = CultureInfo.CreateSpecificCulture("ru-RU");
string[] formats = new[]{"dd MMMM yyyy", "dd.MM.yyyy"};
string[] lines = russianLines.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
var lineDates = new List<DateTime?>();
foreach (string line in lines)
{
    string strDate = null;
    string[] tokens = line.Split(',');
    string[] parts = tokens.First().Split();
    if (parts.Length == 1)
        strDate = parts.First();
    else
        strDate = string.Join(" ", parts.Take(3));
    DateTime dt;
    if(DateTime.TryParseExact(strDate, formats, ruCult, DateTimeStyles.None, out dt))
        lineDates.Add(dt);
    else
        lineDates.Add(null);
}

调试器中的结果:

[0] {13.09.2013 00:00:00}   System.DateTime?
[1] {13.09.2013 00:00:00}   System.DateTime?
[2] {13.09.2013 00:00:00}   System.DateTime?
于 2013-09-13T09:21:08.303 回答
0

你可以托盘这样的东西

第一的

改变文化

 Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("ru");
 Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("ru");

第二

尝试解析你的字符串

 private static DateTime ExtractDateTime(string str)
    {
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("ru");
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("ru");
        string[] date = str.Split(',');

        string[] needeedate = {""};

        needeedate[0] = date[0];
        for (var i = 1; i < date.Length; i++)
        {
            string[] temp1 = date[i].Split(' ');

            foreach (var temp in from s in temp1 where !String.IsNullOrEmpty(s) select needeedate[0] + " , " + s)
            {
                try
                {
                    var res = DateTime.Parse(temp);
                    needeedate[0] = temp;
                }
                catch (Exception)
                {
                    return DateTime.Parse(needeedate[0]);
                }
            }
        }

        return new DateTime();
    }

例子

string d = "13 сентября 2013 г., 11:27 пользователь  <support@example.com> написал:";

var ext = ExtractDateTime(d);
于 2013-09-13T09:43:51.350 回答