Подберите соответствующую информацию из строки, используя регулярное выражение C # 3.0 - PullRequest
1 голос
/ 15 июня 2010

Мне дали имя файла, которое может быть похоже на

<filename>YYYYMMDD<fileextension>

некоторые допустимые имена файлов, которые будут соответствовать вышеуказанному шаблону, такие же, как в

xxx20100326.xls, 
xxx2v20100326.csv, 
x_20100326.xls,
xy2z_abc_20100326_xyz.csv,
abc.xyz.20100326.doc,
ab2.v.20100326.doc,
abc.v.20100326_xyz.xls

В любом случае, как определено выше, мне нужно выбрать только даты. Таким образом, для всех случаев вывод будет 20100326 .

Я пытаюсь добиться того же, но не повезло.

Вот что я сделал до сих пор

string testdata = "x2v20100326.csv";

string strYYYY = @"\d{4}";
string strMM = @"(1[0-2]|0[1-9])";
string strDD = @"(3[0-1]|[1-2][0-9]|0[1-9])";           
string regExPattern = @"\A" +  strYYYY + strMM + strDD +  @"\Z";
Regex regex = new Regex(regExPattern);
Match match = regex.Match(testdata);
if (match.Success)
{
  string result = match.Groups[0].Value;
} 

Я использую c # 3.0 и dotnet framework 3.5

Пожалуйста, помогите. Это очень срочно

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 15 июня 2010

Попробуйте это:

        DateTime result = DateTime.MinValue;
        System.Globalization.CultureInfo provider = System.Globalization.CultureInfo.InvariantCulture;

        var testString = "x2v20100326.csv";
        var format = "yyyyMMdd";
        try
        {
            for (int i = 0; i < testString.Length - format.Length; i++)
            {
                if (DateTime.TryParseExact(testString.Substring(i, format.Length), format, provider, System.Globalization.DateTimeStyles.None, out result))
                {
                    Console.WriteLine("{0} converts to {1}.", testString, result.ToString());
                    break;
                }
            }
        }
        catch (FormatException)
        {
            Console.WriteLine("{0} is not in the correct format.", testString);
        } 
1 голос
/ 15 июня 2010

Этот извлекает последнюю дату в строке.

        var re = new Regex("(?<date>[0-9]{8})");
        var test = "asdf_wef_20100615_sdf.csv";
        var datevalue = re.Match(test).Groups["date"].Value;
        Console.WriteLine(datevalue); // prints 20100615
0 голосов
/ 15 июня 2010

Символы \ A и \ Z - начало и конец строки соответственно. Я думаю, что вам нужен шаблон, как:

string regExPattern = @"\A.*(?<FullDate>" +  strYYYY + strMM + strDD +  @").*\..*\Z";

". *" - любые символы в начале ". * \ .. *" - любые символы перед точкой, точка и любые символы после точки

И получите полную дату:

match.Groups["FullDate"]
0 голосов
/ 15 июня 2010

Вам может понадобиться сгруппировать вещи в выражениях вашего месяца и дня:

((1[0-2])|(0[1-9))
((3[0-1])|([1-2][0-9])|(0[1-9]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...