Regex для токенизации строки в класс

msiinv  2015\03\22  14:58:10

SSMSBoost for SSMS 2012
    Product code:   {94EDFFE7-E4F4-4C9B-A57E-C7267BB4A777}
    Product state:  (5) Installed.
    Assignment: per user
    Package code:   {5D9DA43D-E03A-4420-A8AF-3D2FFBA1A696}
    Version:    2.15.5473.18051
    Publisher:  Solutions Crew
    Language:   1033
    Installed from: C:\Users\EffiaSoft\Downloads\
        Package:    SSMSBoostInstaller2012_2.15.5473.18051.msi
    Product Icon:   %APPDATA%\Microsoft\Installer\{94EDFFE7-E4F4-4C9B-A57E-C7267BB4A777}\icon.ico
    Instance type:  0
    Local package:  C:\Windows\Installer\58b9554a.msi
    Install date:   2015\01\22
    0 patch packages.

Microsoft Application Error Reporting
    Product code:   {95120000-00B9-0409-0000-0000000FF1CE}
    Product state:  (5) Installed.
    Assignment: per machine
    Package code:   {420F351B-33A5-4A58-A856-69B2EDEDC8F7}
    Version:    12.0.6012.5000
    Publisher:  Microsoft Corporation
    Language:   1033
    Installed from: c:\f04684676d077419cb\redist\watson\
        Package:    dw20shared.msi
    About link: http://support.microsoft.com
    Help link:  http://support.microsoft.com
    Instance type:  0
    Local package:  c:\Windows\Installer\913d6.msi
    Install date:   2014\03\19
    0 patch packages.

Я пытаюсь токенизировать этот текст. Результат, который я ожидаю, это вызов класса Software который будет иметь свойства как ProductCode, ProductState и все другие свойства, определенные в тексте, и заполните их значениями после двоеточия. Таким образом, анализ этого файла даст мне список Software учебный класс. Как вы думаете, я должен продолжить это.

1 ответ

Решение

Я не могу комментировать из-за своей репутации (что немного глупо), но вот мое предложение.

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

^\D+(?=:\s)

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

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

мудрый код псевдо будет

Split string up by new line characters
loop through collection of strings
    Run the regex ^\D+(?=:\s)
    switch on the regex string to find the property name
        replace property name with blank space using the regex  ^\D+:\s+
        using the rest of the string as the value set the property.

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

РЕДАКТИРОВАТЬ: обновил регулярное выражение для работы с исключениями в комментарии.

Другие вопросы по тегам