Я борюсь с некоторым регулярным выражением, и мне нужна помощь.
Я на самом деле так же заинтересован в понимании практических рекомендаций, как и то, чтобы что-то работало.
Мое приложение должно прочитать файл и сохранить элемент в зависимости от типа.
Мне нужно обнаружить тип элемента
Я борюсь, потому что мне нужно различать STRING и STRINGLIST.
STRING обычно разделяются символом> >C175012331000400200<
соответствует моему регулярному выражению: ^>\\w+<$
И извлеченный текст - C175012331000400200.
Это хорошо ... но:
Первая проблема:
Но когда дело доходит до STRINGLIST:
>"ProfileId:ATA GRAPHICS.GREXCHANGE<|>","ProfileEd:2.6","SourceCreated b<|>y IsoDraw 7.3,CGM Filter 10.22.50.<|>06","Date:20161207","ColourClass:c<|>olour"<
Есть разделители STRINGS (> <), а извлеченная строка: </p>
"ProfileId:ATA GRAPHICS.GREXCHANGE","ProfileEd:2.6","SourceCreated by IsoDraw 7.3,CGM Filter 10.22.50.06","Date:20161207","ColourClass:colour"
Итак, я знаю, что это STRINGLIST, потому что есть ",", разделяющие строки.
Мне не удалось создать регулярное выражение, обнаруживающее это, поэтому я отступил при обнаружении последовательности <|> .
Если это может помочь, длина между> <разделителями составляет максимум <em>35 символов.
В идеале я хотел бы обнаружить ","
в разделителях, но все, что я проверял, было неверным.
Затем наступила большая проблема :
Я выяснил, что некоторые из моих входных файлов были в двоичном кодировании.
Таким образом, новое представление данных для STRING теперь:
>00C00100700500000100600200000100000<|hex-> ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^|UTF16-> C1750162010|>0000001000000000000002<|hex-> ^^ ^^ ^^ ^^ ^^ ^^ ^^|UTF16-> 00100002
Где на самом деле мне нужно хранить все значения, но человеческое читаемое значение хранится в подразделе UTF16.
Итак, двоичные данные STRINGLIST слишком сложны для меня:
>00C00r00e00a00t00e00d00 00b00y00 00<|hex-> ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^|UTF16-> Created by|>I00s00o00D00r00a00w00 00700.00300,<|hex-> ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^|UTF16-> IsoDraw 7.3,|>00C00G00M00 00F00i00l00t00e00r00 00<|hex-> ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^|UTF16-> CGM Filter|>100000.00200200.00500000.000006<|hex-> ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^|UTF16-> 10.22.50.06
Где извлеченный STRING (который позволяет обнаружить это STRINGLIST) равен
Created by IsoDraw 7.3, CGM Filter 10.22.50.06
* Обратите внимание, что в этом случае разделитель> <теперь используется для необработанных данных, а не «означает»
Также обратите внимание, что в этом случае двойная кавычка, определяющая STRING в STRINGLIST, теперь пропала. Так что в этом случае STRINGLIST определяется благодаря - <em>только - символу , . *
TL / DR:
Мне нужно определить тип элемента:
>C175012331000400200<
Извлеченный текст: C175012331000400200
Тип: STRING
Регулярное выражение: ^>\\w+<$
(Двойной \ из-за интерпретации Java-строки)
>"ProfileId:ATA GRAPHICS.GREXCHANGE<|>","ProfileEd:2.6","SourceCreated b<|>y IsoDraw
7.3,CGM Filter 10.22.50.<|>06","Date:20161207","ColourClass:c<|>olour"<
Извлеченный текст:
*"ProfileId:ATA GRAPHICS.GREXCHANGE","ProfileEd:2.6","SourceCreated by IsoDraw 7.3,CGM Filter
10.22.50.06","Date:20161207","ColourClass:colour"*
Тип: STRINGLIST
REGEX: .+<\\|+>
(Двойной \ из-за интерпретации Java-строки)
>00C00100700500000100600200000100000<|hex-> ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^|UTF16-> C1750162010|>0000001000000000000002<|hex-> ^^ ^^ ^^ ^^ ^^ ^^ ^^|UTF16-> 00100002
Извлеченный текст: C175016201000100002
Тип: STRING
REGEX: пока нет
>00C00r00e00a00t00e00d00 00b00y00 00<|hex-> ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^|UTF16-> Created by|>I00s00o00D00r00a00w00
00700.00300,<|hex-> ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^|UTF16-> IsoDraw 7.3,|>00C00G00M00 00F00i00l00t00e00r00 00<|hex-> ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^|UTF16-> CGM Filter|>100000.00200200.00500000.000006<|hex-> ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^|UTF16-> 10.22.50.06
Извлеченный текст: Created by IsoDraw 7.3, CGM Filter 10.22.50.06
Тип: STRINGLIST
REGEX: пока нет
Заранее спасибо !!!!
РЕДАКТИРОВАТЬ 1: Из-за ответа, во-первых, ребята, во-первых, первый вопрос должен быть «Является ли регулярное выражение хорошим способом сделать это» ... Мои приложения обнаруживают другие типы данных, поэтому я связываю 1 регулярное выражение с типом ,
Я проверил норму файлов импута и наконец понял, что "," только для некодированного STRINGLIST, поэтому регулярное выражение ^(.*)(?=\",\")(.*)$
подходит для такого типа элементов.
Приложение вопрос: есть ли способ перегруппировать группу регулярных выражений для их анализа?
Как: получить весь текст после UTF16, а затем поработать над ним, чтобы обнаружить символ ...
РЕДАКТИРОВАТЬ 2: Подумав об этом, я решаю придерживаться следующих правил для закодированных данных (у меня может быть регулярное выражение обнаружения множественных чисел для одного типа).
И регулярное выражение и соответствующий тип хранятся в LinkedHashMap, поэтому я знаю порядок.
Для ENCODEDLISTSTRING я попытаюсь определить первое значение «UTF16» и попытаюсь выяснить, есть ли, перед следующим> символом, поэтому (UTF16->(.+),(.+)>)
должно сработать.
Если регулярное выражение не соответствует, я буду искать UTF16 для ENCODEDSTRING с (UTF16->(.+)>?)