Java拆分CSV忽略HTML字符

时间:2013-01-18 14:52:14

标签: java regex csv split

我需要用分号分割字符串,忽略可能作为HTML字符的分号。 例如,给定字符串:

id=com.google.android;keywords=Android&#59;Operating System&#59;Phone;versions=Gingerbread&#59;ICS&#59;JB

我需要把它分成:

id = com.google.android
keywords=Android&#59;Operating System&#59;Phone
versions=Gingerbread&#59;ICS&#59;JB

任何想法如何做到这一点?

2 个答案:

答案 0 :(得分:3)

(?<!&#?[0-9a-zA-Z]+);这样的正则表达式可能会这样做。这会阻止匹配终止实体引用或字符引用的分号,但它也会捕获一些技术上不符合规范的情况(例如它与&#foo;末尾的分号不匹配或{ {1}})。

&123;是一个“负面后瞻”,所以你可以把这个正则表达式看作匹配一个分号,该分号前面没有匹配(?<!...)的子字符串(即&符号,可选哈希,以及一个或多个字母数字)。但是,lookbehinds必须具有他们可以匹配的字符数的上限,&#?[0-9a-zA-Z]+没有,所以你必须使用有限的重复计数,如+而不是无界{1,5}。 1}}。上限必须至少与您可能看到的最长实体引用一样长,并且如果您的数据可能包含任意实体引用,那么您将必须使用类似于字符串长度的内容作为上限。

+

如果你可以指定一个更小的界限,那么这可能会更有效。


编辑:Android显然不喜欢这种外观,即使是有限的重复,所以你可能无法使用String[] keyValuePairs = theString.split( "(?<!&#?[0-9a-zA-Z]{1," + theString.length() + "});"); 的单一正则表达式做你所追求的事情,你将拥有自己做循环,例如

String.split

答案 1 :(得分:0)

由于HTML实体在&#39;&amp;#&#39;之间只有两个或三个数字。和&#39;;&#39;我使用了以下正则表达式:

(?<!&#\d{2,3});