c#如何在字符串中查找特定模式?

时间:2014-04-02 15:32:07

标签: c# string pattern-matching

我有一个包含字母和数字的字符串。该字符串还包含我要提取的日期。

示例:anv749dld95hd01/01/2012ncjf739dkcju

我想获得包含以下内容的新字符串:01/01/2012

我唯一想到的就是使用它来分割它:str.Split('/') 通过这种方式,我将获得一个数组并处理每个单元格 - 获取第一个单元格的最后两个字符,获取第二个单元格的值,然后从第三个单元格中获取前4个字符。

有更好的方法吗?

3 个答案:

答案 0 :(得分:5)

你可以使用正则表达式:

using System;
using System.Text.RegularExpressions;

class Test
{    
    static void Main()
    {
        var input = "anv749dld95hd01/01/2012ncjf739dkcju";
        var regex = new Regex(@"\d{2}/\d{2}/\d{4}");
        var match = regex.Match(input);
        if (match.Success)
        {
            Console.WriteLine("Got match: {0}", match.Value);
        }
        else
        {
            Console.WriteLine("No match found");
        }
    }
}

(您可以致电Match.NextMatch查看是否只有一个匹配。)

要将其解析为DateTime,您就可以使用以下内容:

string dateText = match.Value;
DateTime date;
if (DateTime.TryParseExact(dateText, "dd/MM/yyyy",
                           CultureInfo.InvariantCulture,
                           DateTimeStyles.None, out date))
{
    // Use date
}
else
{
    // Couldn't parse the value
}

(我们无法判断它是dd/MM/yyyy还是MM/dd/yyyy;根据需要进行调整。)

如果你愿意,你还可以额外收紧正则表达式,这样月份的第一个数字必须是0或1,而当天的第一个数字必须是0,1或2.这取决于什么你的数据真的很像。

答案 1 :(得分:2)

你可以使用Substring,你可以找到第一个正斜杠,然后在两个字符前面开始子字符串,然后取10个字符。

string date = str.Substring(s.IndexOf('/')-2, 10);

您可以使用DateTime.TryParseExact解析子字符串,以确保您获得正确的子字符串。

bool isParsed = DateTime.TryParseExact(date, "dd/MM/YYYY", CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out x1);

答案 2 :(得分:0)

使用RegEx查找模式并返回所需的字符串。