我正在努力争取一些正则表达式,而且我需要帮助。
我实际上对理解"操作方法"为了有所作为。
我的应用需要根据类型读取文件和存储元素。 我需要检测元素的类型 我挣扎是因为我需要区分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分隔符(&gt;&lt;)在那里,提取的字符串是:
"ProfileId:ATA GRAPHICS.GREXCHANGE","ProfileEd:2.6","SourceCreated by IsoDraw 7.3,CGM Filter 10.22.50.06","Date:20161207","ColourClass:colour"
所以,我知道这是一个STRINGLIST,因为有&#34;,&#34;分开琴弦。
我无法创建正则表达式检测,所以我回避检测&lt; |&gt; 序列。
如果它可以帮助,则&gt;&lt;&lt;分隔符是最大 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
*请注意,在这种情况下,&gt;&lt;分隔符现在用于rawdata而不是&#34;意思是&#34; 还请注意,在这种情况下,定义STRINGLIST中STRING的双引号现在已经消失。因此,在这种情况下,STRINGLIST被识别为感谢 - 仅 - 指向,字符。*
TL / DR:
我需要检测元素的类型:
>C175012331000400200<
提取的文字:C175012331000400200
输入: STRING
正则表达式:^>\\w+<$
(Double \因为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:.+<\\|+>
(Double \因为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:由于回应,首先要感谢你们,第二个问题应该是&#34;正则表达式是一个很好的方法来做到这一点&#34; ...我的应用程序检测其他类型的数据,因此我将1个正则表达式与类型相关联。
我查看了imput文件的规范,最后我发现了&#34;,&#34;仅适用于非编码的STRINGLIST,因此正则表达式^(.*)(?=\",\")(.*)$
适用于这种元素。
附件问题:有没有办法重新组合正则表达式组来解析它们? 比如:在UTF16之后获取所有文本然后处理它以检测,字符......
编辑2:在考虑之后,我决定对编码数据采用以下规则(我可以为一种类型设置多次检测正则表达式)。
正则表达式和相应的类型存储在LinkedHashMap中,所以我知道顺序。
对于ENCODEDLISTSTRING,我将尝试检测第一个值&#34; UTF16&#34;并在下一个&gt;之前尝试查看是否有。这样的字符(UTF16->(.+),(.+)>)
应该可以解决问题。
如果正则表达式不匹配,我将使用(UTF16->(.+)>?)
答案 0 :(得分:0)
所以这是正则表达式:
^(>)([\\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->
和|
,其间是您想要的文本。
现在你需要使用正则表达式中正确的组,你没事。