正则表达式 - 使用正则表达式

时间:2018-05-09 08:31:29

标签: java regex

我正在努力争取一些正则表达式,而且我需要帮助。

我实际上对理解"操作方法"为了有所作为。

我的应用需要根据类型读取文件和存储元素。 我需要检测元素的类型 我挣扎是因为我需要区分STRING和STRINGLIST。

STRING通常由&gt;&lt;分隔开来。在我的应用中,所以 >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->(.+)>?)

查找ENCODEDSTRING的UTF16

1 个答案:

答案 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->|,其间是您想要的文本。

现在你需要使用正则表达式中正确的组,你没事。