2012-03-04 3 views
3

Я использую C#Regex дата время сопоставления,

string content = " 4 marco bob 53 AUSTRIA (Jan. 13, 2012) – McDonald Janruary 15, 2021 July 15, 2923 June 2 2343 7/25/23 08/22/3323"; 

Это должно recognice все даты кроме «4 марко боб 53», которая, очевидно, не даты и времени. Тем не менее, мои правила (ниже) соответствуют ему (4 marco bob 53), и я не могу понять, как избежать соответствия этому (или аналогичным примерам).

Я пытаюсь совместить строку выше для всех дат. Я написал 3 правила, чтобы сопоставить некоторые общие шаблоны дат.

например:

шаблон f0: 5/2/2012

шаблон f2: 3 марта 1900 или 3 марта 1990 или 3 марта 1990 и т.д ...

Pattern f3: 4 января 2021 или 4 января 2021, и т.д ...

string f0 = "([0-9]{1,2})/([0-9]{1,2})/([0-9]{2,4})"; 
string f1 = "([0-9]{1,2})\\s+([jJ][aA][nN].*?|[fF][eE][bB].*?|[mM][aA][rR].*?|[aA][pP][rR].*?|[mM][aA][yY].*?|[jJ][uU][nN].*?|[jJ][uU][lL].*?|[aA][uU][gG].*?|[sS][eE][pP].*?|[oO][cC][tT].*?|[nN][oO][vV[.*?|[dD][eE][cC].*?)\\s+([0-9]{2,4})"; 
string f2 = "([jJ][aA][nN].*?|[fF][eE][bB].*?|[mM][aA][rR].*?|[aA][pP][rR].*?|[mM][aA][yY].*?|[jJ][uU][nN].*?|[jJ][uU][lL].*?|[aA][uU][gG].*?|[sS][eE][pP].*?|[oO][cC][tT].*?|[nN][oO][vV[.*?|[dD][eE][cC].*?)\\s+([0-9]{1,2})[\\s,]+([0-9]{2,4})"; 

Я новичок в регулярных выражений, поэтому я уверен, что я делаю какие-то глупые вещи (например, не используя нечувствительные к регистру варианты и т. д.), поэтому дайте мне знать, как я могу улучшить это.

Это для обучения регулярных выражений, а не обучение, как использовать функции библиотеки ....

ответ

2

Совокупный ряд ответов, размещенных, чтобы делать то, что я хотел. Это, по-видимому, хорошо находит даты в свободном тексте. Спасибо всем плакатам.

string f0 = "(?:(\\d{1,2})/(\\d{1,2})/(\\d{2,4}))"; 
string f1 = "(?:(\\s\\d{1,2})\\s+(jan(?:uary){0,1}\\.{0,1}|feb(?:ruary){0,1}\\.{0,1}|mar(?:ch){0,1}\\.{0,1}|apr(?:il){0,1}\\.{0,1}|may\\.{0,1}|jun(?:e){0,1}\\.{0,1}|jul(?:y){0,1}\\.{0,1}|aug(?:ust){0,1}\\.{0,1}|sep(?:tember){0,1}\\.{0,1}|oct(?:ober){0,1}\\.{0,1}|nov(?:ember){0,1}\\.{0,1}|dec(?:ember){0,1}\\.{0,1})\\s+(\\d{2,4}))"; 
string f2 = "(?:(jan(?:uary){0,1}\\.{0,1}|feb(?:ruary){0,1}\\.{0,1}|mar(?:ch){0,1}\\.{0,1}|apr(?:il){0,1}\\.{0,1}|may\\.{0,1}|jun(?:e){0,1}\\.{0,1}|jul(?:y){0,1}\\.{0,1}|aug(?:ust){0,1}\\.{0,1}|sep(?:tember){0,1}\\.{0,1}|oct(?:ober){0,1}\\.{0,1}|nov(?:ember){0,1}\\.{0,1}|dec(?:ember){0,1}\\.{0,1})\\s+([0-9]{1,2})[\\s,]+(\\d{2,4}))"; 

MatchCollection mc = Regex.Matches(content, f0 + "|" + f1 + "|" + f2, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); 
1

Вы должны указать, какой язык вы делаете это.

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

+0

Пытается научиться регулярному выражению. –

+0

Укажите, на каком языке вы пытаетесь изучить регулярное выражение, и я пересмотрю свой ответ. – AlanFoster

+0

Я тоже ... Кроме того, я не знаю каких-либо методов C# для анализа всех дат времени из текстового документа (например, свободного текста). –

2

Ваше регулярное выражение соответствует строковое f1 по следующим причинам:

  • 4 из ([0-9]{1,2})\\s+
  • mar из [mM][aA][rR]
  • co bob из .*?
  • 53 из \\s+([0-9]{2,4}

Удалите .*?, который у вас есть после каждого месяца. Это означает матч любой персонаж в не жадном виде. Итак, что это такое, он проверяет, что ваше следующее условие в вашем случае \\s+([0-9]{2,4}, так что вы соответствуете

2

Адресация только с именем-month-pattern: это объединяет 2 и 3 и потребует еще один шаг, чтобы исправить последнее совпадение здесь : 89 Febuary 12, 2099, но могут быть разделены на довольно легко, если вы хотите сделать это таким образом:

string input = " 4 marco bob 53 AUSTRIA (Jan. 13, 2012) – McDonald January 15, 2021 July 15, 2923 June 2 2343 7/25/23 08/22/3323 7 jul 2098 0 Jan 0 fake stuff 89 Febuary 12, 2099 it is a greedy"; 
    var pattern = 
    @"(\d\d?\s)? (?# greedily gather preceding dd) 
    (jan(uary)?|feb(uary)?|mar(ch)?|apr(il)?|may|june?|july?|aug(ust)?|sep(tember)?|nov(ember)?|dec(ember)?) 
    \.?\s?     
    (\d\d?\b,?\s*)? (?# optional day part) 
    \d\d(\d\d)?";   

    var matches = Regex.Matches(input, pattern, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); 
    string result = string.Empty; 
    for (int i = 0; i < matches.Count; i++) 
    { 
     result += "match " + i + ",value:" + matches[i].Value + "\n"; 
    } 
    Console.WriteLine(result); 

редактирования: не возвратами не было необходимости (остаток более сложного прогнозного подхода) -Удалена эту часть.

Смежные вопросы