java - 正则表达式 - 使用正则表达式检测数据类型
问题描述
我正在与一些正则表达式作斗争,我需要帮助。
实际上,我对理解“如何做”和让某些东西起作用一样感兴趣。
我的应用程序需要根据类型读取文件和存储元素。我需要检测我正在努力的元素类型,因为我需要区分 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->(.+)>?)
解决方案
所以这里是正则表达式:
^(>)([\\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->
,|
中间是你想要的文本。
您现在只需要使用正则表达式中的正确组就可以了。
推荐阅读
- python - 仅当一个功能完成工作后,如何使两个功能相互跟随
- javascript - 使用 Cypress 在 SVG 上测试 onclick 事件
- php - 从单击的 div 的 ID 中获取价值 - php mysql 问题
- php - 比较不同时间戳的问题
- git - 使用用作模块源的 bitbucket 存储库处理 ssh/https 身份验证
- c++ - 向量的分配是否比 C++ 中的原始数组花费更多时间?
- c - 将 fgetc() 的返回值与随机数字进行比较
- android - 我对 android 不兼容片段中的片段有疑问
- java - 无法确定类型:com.packt.cardatabase.domain.Owner,表:car,列:[org.hibernate.mapping.Column(owner)]
- coq - 在 Coq 中重命名假设的一部分