Regex - обнаружение типа данных с помощью регулярного выражения - PullRequest
0 голосов
/ 09 мая 2018

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

Я на самом деле так же заинтересован в понимании практических рекомендаций, как и то, чтобы что-то работало.

Мое приложение должно прочитать файл и сохранить элемент в зависимости от типа. Мне нужно обнаружить тип элемента Я борюсь, потому что мне нужно различать 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->(.+)>?)

1 Ответ

0 голосов
/ 09 мая 2018

Итак, вот регулярные выражения:

^(>)([\\w|\\d]*)(<)$

для вашего

>C175012331000400200<

объяснение: взять весь текст, содержащий цифры и буквы, завернутые в > <

(?s)(.)+(<|>)*

для текста (это не полностью проверено)

>"ProfileId:ATA GRAPHICS.GREXCHANGE<|>","ProfileEd:2.6","SourceCreated b<|>y IsoDraw 
7.3,CGM Filter 10.22.50.<|>06","Date:20161207","ColourClass:c<|>olour"< 

пояснение: (?s) должен проверять все строки, даже если есть новая строка. (.)+(<|>)* получите группы текста и <|>, и тогда вам следует использовать только те группы, которые вас интересуют.

(?s)((.*UTF16->)([\\s|\\.|\\w|\\d]+)(|)?)* 

к совпадению:

>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

и

>00C00100700500000100600200000100000<|hex->  ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^|UTF16->  C1750162010|>0000001000000000000002<|hex->   ^^ ^^ ^^ ^^ ^^ ^^ ^^|UTF16->  00100002

объяснение: (?s) преобразует все новые строки в ., тогда у вас есть два разделителя UTF16-> и |, где между ними находится желаемый текст.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...