Дана строка в которой содержится осмысленное текстовое сообщение

Обновлено: 02.07.2024

Во-первых, каковой формат года? Должно быть 4 знака, то есть гггг = [0001, 2020]
Во-вторых, каковой формат самой даты? Это число без разделителей? ддммгггг?
Либо с разделителями - точками, что более естественно? дд.мм.гггг?
Либо с разделителями - слешами, по-американски? дд/мм/гггг?
Или совсем по-американски, месяц впереди денька? мм/дд/гггг?
Или без разделителей, но в оборотном порядке? ггггммдд? Я и такое видел!
Будем считать, что это число без разделителей, 1 вариант, ддммгггг. 8 цифр.
Тогда проверка должна быть приблизительно таковой:
Пишу на бейсике, на паскаль сами переводите.
Poz1 = 1: Poz2 = 0
Do While Poz1 gt; 0 ' Цикл, пока в строке встречаются пробелы
Poz2 = InStr(Poz1, Stroka, " ") ' Отыскиваем пробел в строке
If Poz2 gt; 0 Then ' Если отыскали пробел - это конец слова
If Poz2 - Poz1 = 8 Then ' Если длина слова 8 знаков
Flag = True ' Признак, что это 8 цифр, устанавливаем в правду
For i= 1 To 8
If Chr( Mid (Stroka, Poz1 + i - 1, 1)) lt; amp;H30 Or _
Chr( Mid (Stroka, Poz1 + i - 1, 1)) gt; amp;H39 Then
Flag = False ' Какой-то из символов оказался НЕ цифрой
End If
Next i
If Flag = True Then ' Если это все же 8 цифр, то проверяем, дата ли это
Day = Val (Mid (Stroka, Poz1, 2))
Month = Val (Mid (Stroka, Poz1+2, 2))
Year = Val (Mid (Stroka, Poz1+4, 4))
If (Day gt;= 1) And (Day lt;= 31) And (Month gt;= 1) And (Month lt;= 12) _
And (Year gt;= 1) And (Year lt;= 2020) Then ' Если это ДАТА
Call ChangeDate(Day, Month, Year) ' Вызываем п/п подмены даты
End If
End If
End If
Else ' Если не нашли пробел - это было последнее слово
Poz2 = Len(Stroka) ' Устанавливаем Poz2 на конец строчки
If Poz2 - Poz1 = 8 Then ' Если длина слова 8 знаков
Flag = True ' Признак, что это 8 цифр, устанавливаем в правду
For i= 1 To 8
If Chr( Mid (Stroka, Poz1 + i - 1, 1)) lt; amp;H30 Or _
Chr( Mid (Stroka, Poz1 + i - 1, 1)) gt; amp;H39 Then
Flag = False ' Какой-то из символов оказался НЕ цифрой
End If
Next i
If Flag = True Then ' Если это все же 8 цифр, то проверяем, дата ли это
Day = Val (Mid (Stroka, Poz1, 2))
Month = Val (Mid (Stroka, Poz1+2, 2))
Year = Val (Mid (Stroka, Poz1+4, 4))
If (Day gt;= 1) And (Day lt;= 31) And (Month gt;= 1) And (Month lt;= 12) _
And (Year gt;= 1) And (Year lt;= 2020) Then ' Если это ДАТА
Call ChangeDate(Day, Month, Year) ' Вызываем п/п замены даты
End If
End If
End If
End If
Poz1 = Poz2 ' Устанавливаем начало нового слова
Loop
End Sub

Sub ChangeDate()
If (Day = 31) And (Month = 12) Then ' Если это было 31 декабря
Year = Year + 1 ' То ставим 1 января последующего года
strDay = "01": strMounth = "01": strYear = Trim(Str(Year))
ElseIf (Day = 31) And (Month = 1) Then ' 31 января
strDay = "01": strMounth = "02": strYear = Trim(Str(Year))
ElseIf (Day = 28) And (Month = 2) And (Year Mod 4 lt;gt; 0) Then ' 28 февраля
strDay = "01": strMounth = "03": strYear = Trim(Str(Year))
ElseIf (Day = 29) And (Month = 2) And (Year Mod 4 = 0) Then ' 29 февраля
strDay = "01": strMounth = "03": strYear = Trim(Str(Year))
ElseIf (Day = 31) And (Month = 3) Then ' 31 марта
strDay = "01": strMounth = "04": strYear = Trim(Str(Year))
ElseIf (Day = 30) And (Month = 4) Then ' 30 апреля
strDay = "01": strMounth = "05": strYear = Trim(Str(Year))
ElseIf (Day = 31) And (Month = 5) Then ' 31 мая
strDay = "01": strMounth = "06": strYear = Trim(Str(Year))
ElseIf (Day = 30) And (Month = 6) Then ' 30 июня
strDay = "01": strMounth = "07": strYear = Trim(Str(Year))
ElseIf (Day = 31) And (Month = 7) Then ' 31 июля
strDay = "01": strMounth = "08": strYear = Trim(Str(Year))
ElseIf (Day = 31) And (Month = 8) Then ' 31 августа
strDay = "01": strMounth = "09": strYear = Trim(Str(Year))
ElseIf (Day = 30) And (Month = 9) Then ' 30 сентября
strDay = "01": strMounth = "10": strYear = Trim(Str(Year))
ElseIf (Day = 31) And (Month = 10) Then ' 31 октября
strDay = "01": strMounth = "11": strYear = Trim(Str(Year))
ElseIf (Day = 30) And (Month = 11) Then ' 30 ноября
strDay = "01": strMounth = "12": strYear = Trim(Str(Year))
Else ' Хоть какой иной день
Day = Day + 1 ' Ставим следующий день
If (Day lt; 10) Then strDay = "0" amp; Trim(Str(Day)) Else strDay = Trim(Str(Day))
If (Mounth lt; 10) Then strMounth = "0" amp; Trim(Str(Mounth)) Else strMounth = Trim(Str(Mounth))
End If
If Year lt; 10 Then
strYear = "000" amp; strYear
ElseIf Year lt; 100 Then
strYear = "00" amp; strYear
ElseIf Year lt; 1000 Then
strYear = "0" amp; strYear
End If
Stroka = Left(Stroka, Poz1) amp; strDay amp; strMonth amp; strYear amp; Mid(Stroka, Poz2)
End Sub
Как видите, программа оказалась очень сложный.

Перевод достаточно простой, языки похожи. Вместо цикла Do While (условие) . Loop пишешь while (условие) do begin . end;

Читайте также: