GK_4 Ответов: 2

Как определить дату по строке


Hi,

I need to identify date present in a string and string is "This year 2018 January 1 was on monday". From this string i want to get 2018 January 1 as date. Can any one suggest me how i can do this in C#.

Thanks.

What I have tried:

Tried to identify date using property of DateTime but could not get any solution for this.

Kornfeld Eliyahu Peter

Вы ищете фиксированный формат? Или это может быть "1 января 2018 года" тоже и другие?

GK_4

Формат дат не фиксирован. Допустимая дата может быть любой в любом формате.Как уже упоминалось ниже.

1/1/18 месяц первый
1/1/18 День первый
1/01/19
1.1.18
18/1/1
2018/1/1
1 января 18
1 января 2018 года
1 января 2018 года
1 января 2018 года

Kornfeld Eliyahu Peter

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

Richard MacCutchan

Вам нужно разбить строку на отдельные токены и найти значения, которые выглядят как элементы даты.

2 Ответов

Рейтинг:
2

OriginalGriff

Это будет трудно, если не невозможно, если только формат даты и / или строки не будет абсолютно фиксированным.
Проблема в том, что существует так много способов написания действительной даты:

1/1/18  Month first
1/1/18  Day first
1/01/19
1.1.18
18/1/1
2018/1/1
Jan 1st 18
January 1 2018
1 Jan 2018
2018 January 1
...
А это значит, что просто найти его-серьезная проблема.

Если это фиксированный формат, то с регулярным выражением это относительно просто:
\d{4}\s(January|Februrary|March|April|May|June|July|August|September|October|November|December)\s\d{1,2}
Должны делать это.


Рейтинг:
0

Maciej Los

Я бы предложил использовать Класс регулярных выражений[^].

string[] data = {"This year 2018 January 1 was on monday", 
				"Bla bla bla 1990 Feb 20 Lorem ipsum",
				"2001 May 30. i married Jasmine",
				"My daughter was born 1970 Feb 20",
				"1988 Dec 24 Lorem ipsum",
				"Ipsum Lorem 2022 June 31 Bla bla bla"};
string pattern = @"\b(?:(19|20)\d{2}) ?\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|(Nov|Dec)(?:ember)?)\D?(\d{1,2}\D?)";


Regex r = new Regex(pattern);
var result = data
	.Where(x=>r.Matches(x).Count>0)
	.Select(x => new
	{
		InputText = x,
		PossibleDate = r.Matches(x).Cast<Match>().Select(y=>y.Value).First()
	})
	.ToList();

foreach(var d in result)
{
	Console.WriteLine("{0} \n\t\t=> {1}", d.InputText, d.PossibleDate);
}


Результат:
This year 2018 January 1 was on monday 
    => 2018 January 1 
Bla bla bla 1990 Feb 20 Lorem ipsum 
    => 1990 Feb 20 
2001 May 30. i married Jasmine 
    => 2001 May 30.
My daughter was born 1970 Feb 20 
    => 1970 Feb 20
1988 Dec 24 Lorem ipsum 
    => 1988 Dec 24 
Ipsum Lorem 2022 June 31 Bla bla bla 
    => 2022 June 31


Для получения более подробной информации, пожалуйста, смотрите:
Регулярное выражение для сопоставления имени месяца с последующим годом[^]
Как объединить запросы LINQ с регулярными выражениями[^]