我需要用分号分割字符串,忽略可能作为HTML字符的分号。 例如,给定字符串:
id=com.google.android;keywords=Android;Operating System;Phone;versions=Gingerbread;ICS;JB
我需要把它分成:
id = com.google.android
keywords=Android;Operating System;Phone
versions=Gingerbread;ICS;JB
任何想法如何做到这一点?
答案 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});