Где скрылась ошибка и как ограничить поиск даты в регулярных выражениях - C#

Узнай цену своей работы

Формулировка задачи:

Есть задание: Текстовый файл in.txt содержит текст на английском языке, в котором присутствуют: – корректные даты в формате деньXмесяцXгод, где день и месяц – одна или две цифры, год – две или четыре цифры. X – разделитель: точка, прямой слеш или минус (одинаковый в каждой дате, но может быть разным в разных датах). – корректные денежные суммы в формате сумма belarusian roubles или сумма blr, где cумма – число, разбитое на разряды произвольным числом пробелов (например, 32 671 000 blr). Программа должна сделать следующее: 1 Преобразовать даты в тексте в американский формат Month day, year (например, October 3, 2010). 2 Убрать пробелы между разрядами в суммах (например, 32671000 blr). В написаном мной коде наблюдается две ошибки: 1)В файле с Main при считывании файла построчно отображается результат только одной строчки: Либо: result = money.Get(line); либо result = date.Get(line); И ту и другую замену одновременно делать не хочет, при чем если поменять местами работает наоборот. Наблюдал в отлатчике и по точкам остановки, то работает одновременно, а вот на экран уже не идет. 2)В Регулярном выражении для поимки даты не могу задать корректные параметры, то есть такое как 19.03.10265 считает как 19 марта 10265 года, хочется задать более призимленные и точные параметры, как ограничить поиск хотя бы четырьмя цифрами в конце, все что я пробовал не работает либо начинает считывать дату без года. Вот код:
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
 
namespace Task_2
{
    class Program
    {
        static void Main(string[] args)
        {
            string line, result;
            MoneyHandling money = new MoneyHandling();
            DataHandling date = new DataHandling();
            StreamReader file = new StreamReader(@"../../in.txt");
            Console.WriteLine(file.ReadToEnd());
            file.BaseStream.Position = 0;
 
            while ((line = file.ReadLine()) != null)
            {
                result = money.Get(line);
                result = date.Get(line);
                Console.WriteLine(result);
            }
 
            file.Close();
            Console.ReadKey();
        }
    }
 public abstract class Handling
    {
        string str;
        public string Str
        {
            get { return str; }
            set { str = value; }
 
        }
        public Handling()
        { }
        public Handling(string Str)
        {
            str = Str;
        }
 
        public abstract string Get(string str);
 
        public abstract string Change(Match m);
    }
public   class DataHandling : Handling
    {
        public DataHandling() : base()
        { }
        public DataHandling(string Str) : base(Str)
        { }
        public override string Get(string StrData)
        {
            Regex tempReg = new Regex(@"\b[0-2](0[1-9]|[12][0-9]|3[01]|[1-9])[-/.](0[1-9]|1[012]|[1-9])[-/.](([012][0-9])\d{2}|\d{2})", RegexOptions.IgnoreCase);
            string temp = tempReg.Replace(StrData, new MatchEvaluator(Change));
            return temp;
        }
        public override string Change(Match d)
        {
            string s = d.ToString();
            DateTime date = Convert.ToDateTime(s);
            return (date.ToString("MMMM dd, yyyy", System.Globalization.CultureInfo.CreateSpecificCulture("en-US")));
        }
    }
 public class MoneyHandling : Handling
    {
        
        public MoneyHandling():base()
        { }
        public MoneyHandling(string Str) : base(Str)
        { }
        public override string Get(string StrMoney)
        {
            Regex tempReg = new Regex(@"\b[0-9][0-9,\s]+( blr| belarusian roubles)", RegexOptions.IgnoreCase);
            string temp = tempReg.Replace(StrMoney, new MatchEvaluator(Change));
            return temp;
        }
 
        public override string Change(Match m)
        {
            int found;
            string x = m.ToString();
            found = x.IndexOf("b");
            string end = x.Substring(found);
            x = x.Remove(found);
 
            Regex reg = new Regex(@"\s", RegexOptions.IgnoreCase);
            x = reg.Replace(x, "");
            
            return (x + " " + end);
        }
 
    }
}
in.txt in.txt

Решение задачи: «Где скрылась ошибка и как ограничить поиск даты в регулярных выражениях»

textual
Листинг программы
@"(\b(((\b((([012]?)\d)|(30|31))\.(((0?)[13567])|(1[02])))|(\b((([012]?)\d)|30)\.((0?)[469(11)]))|(\b(([012]?)\d)\.2))\.(\d{2}|\d{4})\b)|(((\b((([012]?)\d)|(30|31))/(((0?)[13567])|(1[02])))|(\b((([012]?)\d)|30)/((0?)[469(11)]))|(\b(([012]?)\d)/2))/(\d{2}|\d{4})\b)|(((\b((([012]?)\d)|(30|31))-(((0?)[13567])|(1[02])))|(\b((([012]?)\d)|30)-((0?)[469(11)]))|(\b(([012]?)\d)-2))-(\d{2}|\d{4})\b))"

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5
Похожие ответы