2016-01-18 3 views
1

Мне нужно найти конкретную строку даты в текстовом файле. В настоящее время в файле две строки даты - «Дата погашения: 01/26/2016» и «Дата: 01/252016». Мне нужно найти второй, но мой текущий код находит только первый. Я предполагаю, что регулярное выражение будет лучшей реализацией, но не уверен, как его кодировать.Использование regex для поиска строки даты в файле

Текущий код -

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; 
} 
+0

В случае, если «Дата: 01/252016» быть " Дата: 25.01.2016 "? –

+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 содержит опечатку.

+0

На самом деле вторая дата не опечатка .. это то, что находится в текстовом файле. – Craig

+0

@Craig Вы можете сделать косые черты необязательными. Вам также нужно включить более одного формата, если вы хотите проанализировать 'DateTime', поскольку регулярное выражение может соответствовать недопустимым датам типа« 19/99/0000 ». – juharr

+0

Вправо - вы можете изменить свое регулярное выражение на '[[0-1]? [0-9] /? [0-9] {2} /? [0-9] {4}", если косые черты обязательный. – Donald

0

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

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

Поскольку обе строки включают в себя «Date», мы можем использовать, чтобы дополнительно отфильтровать другие строки (вы не могли бы на самом деле хотите, чтобы все даты). Поскольку Due является необязательным, мы можем отметить его как таковой. Немного сложно отфильтровать плохо отформатированные даты, но вы можете ограничить несколько вещей (например, я выше). Вы должны будете подтвердить дату отдельно, чтобы быть уверенным.

Вот Regex, который не будет заботиться о проверках, пока он правильно отформатирован:

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

Или только даты:

([0-9]{2})\/([0-9]{2})\/([0-9]{4}) 
Смежные вопросы