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. Я не знаю, насколько это возможно для вашего результата, но сделаю это намного лучшим решением.
РЕДАКТИРОВАТЬ: обновил регулярное выражение для работы с исключениями в комментарии.