2012-02-08 4 views
1

У меня есть неструктурированная строка. Из этого мне нужно найти дату.Дата синтаксического анализа из неструктурированной строки

Пример: [ожидаемые входы]

  1. "01/21/2012: текст будет здесь"
  2. "; 01/21/2012: текст будет здесь"
  3. «текст будет здесь 01/21/2012:. продолжается текст»
  4. „текст будет здесь \ п 01/21/2012:. продолжается текст“
  5. „ текст будет здесь 01/21/2012“

Примечание: Дата может быть любого формата, такого как 1 января 2012 года, 12 января 2012 года, 12/01/2012 и т. Д.

Любые помощь, которые могут быть использованы.

+3

VB или C#, пожалуйста, выберите язык? – DaveShaw

+3

Как вы будете различать эти два разных способа написания 12 января: 1/12/2012 и 12/1/2012? –

+0

Знаете ли вы все форматы даты, которые могут произойти? – Svisstack

ответ

0

Я думаю, что регулярное выражение поможет.

Во-первых, запишите все возможные форматы даты вторых, преобразуйте их в регулярное выражение final, match the regular expression.

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

2

Почему пользователь вводит данные, позволяющие начать такой текст свободной формы? С учетом того, что открытый синтаксический разбор строки вы делаете, в лучшем случае будет пятнистым. Что делать, если пользователь вводит числа, которые выглядят как даты или другая дата? Как бы вы определили, какая дата была «датой», которую нужно отслеживать?

Дополнительная информация о вашей проблеме МОЖЕТ помочь с решением, но прямо сейчас я предлагаю ввести дату для ввода в свой собственный элемент ввода.

+0

Я полностью согласен с вами. Я забыл добавить один важный момент. Это переход из некоторого унаследованного приложения. –

+0

Ах, тогда я чувствую твою боль! Предложения reg ex помогут вам ближе всех, чем вы можете получить.Я разбирал бы все, что бы напоминало дату, и сохранил исходную строку, так что у вас будет резерв, если синтаксический анализ когда-либо должен быть проверен. – Chuck

0

Лучший способ - использовать RegEx, но вам придется создавать правила для всех форматов даты. В противном случае вы можете использовать более общее выражение регулярных выражений, а затем найти все совпадения и проверить/проанализировать как дату.

Надеюсь, что вы получите представление о том, как это сделать.

1

Разберите строку в промежуточные блоки, разделенные пробелами, похоже, что string.split ("") почти работает, но вам может потребоваться выполнить учет ваших «:» s.

На каждом блоке установите флажок DateTime.TryParse.

Dim text(2) As String 
    text(0) = "01/21/2012: text will be here" 
    text(1) = "text will be here. \n 01/21/2012: continues text" 
    text(2) = " text will be here 01/21/2012" 

    For Each s As String In text 
     Dim a As String() = s.split(" "c) 
     For Each s1 As String In a 
      If s1.endswith(":") Then s1 = s1.remove(s1.length-1) 
      Dim dt As datetime 
      Dim ok As Boolean = datetime.tryparse(s1,dt) 
      If ok = True Then output.writeline(dt.tostring) 
     Next s1 
    Next s 
+0

Хотя я ожидаю, что это все равно пострадает от комментариев, упомянутых выше Чака, я думаю, что идея использования datetime.tryparse (или какого-то другого пакета манипулирования датой) для всех «действительно ли это дата?». проверки были бы более разумными, чем любое обнаружение домашнего пива без серьезного размышления. – deepee1

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