首页 > 解决方案 > 正则表达式 - 使用正则表达式检测数据类型

问题描述

我正在与一些正则表达式作斗争,我需要帮助。

实际上,我对理解“如何做”和让某些东西起作用一样感兴趣。

我的应用程序需要根据类型读取文件和存储元素。我需要检测我正在努力的元素类型,因为我需要区分 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 分隔符 ( >< ) 在那里,提取的字符串是:

 "ProfileId:ATA GRAPHICS.GREXCHANGE","ProfileEd:2.6","SourceCreated by IsoDraw 7.3,CGM Filter 10.22.50.06","Date:20161207","ColourClass:colour"

所以,我知道这是一个字符串列表,因为有“,”分隔字符串。

我无法创建一个正则表达式来检测它,所以我回退到检测<|>序列。如果有帮助,>< 分隔符之间的长度最多为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

*请注意,在这种情况下,>< 分隔符现在用于原始数据,而不是“含义”。另请注意,在这种情况下,在 STRINGLIST 中定义 STRING 的双引号现在消失了。因此,在这种情况下,STRINGLIST通过,字符来识别。*


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 正则表达式:还没有


>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->(.+),(.+)>)应该这样做。如果正则表达式不匹配,我会为 ENCODEDSTRING 寻找 UTF16(UTF16->(.+)>?)

标签: javaregex

解决方案


所以这里是正则表达式:

^(>)([\\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->|中间是你想要的文本。

您现在只需要使用正则表达式中的正确组就可以了。


推荐阅读