Java拆分CSV忽略HTML字符

Java拆分CSV忽略HTML字符,java,regex,csv,split,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;Pho

我需要用分号分割字符串,忽略可能作为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
有没有办法做到这一点?

类似正则表达式的
(?)可能会做到。这将阻止匹配终止实体引用或字符引用的分号,尽管它也会捕获一些从技术上讲不符合规范的情况(例如,它与
&foo;
&123;
结尾的分号不匹配)

(?是一个“负lookback”,因此您可以将此正则表达式读取为匹配分号,而分号前面没有匹配
&#?[0-9a-zA-Z]+
(即,与符号、可选哈希和一个或多个字母数字)的子字符串。但是,lookbehind必须对它们可以匹配的字符数有一个上限,而
+
没有上限,因此必须使用有界重复计数,如
{1,5}
而不是无界的
+
。上限需要至少与您可能看到的最长实体引用一样长,如果您的数据可能包含任意实体引用,则必须使用类似字符串长度的内容作为上限

String[] keyValuePairs = theString.split(
    "(?<!&#?[0-9a-zA-Z]{1," + theString.length() + "});");
类似于
的正则表达式(可能会这样做。这将阻止匹配终止实体引用或字符引用的分号,尽管它也会捕获一些从技术上讲不符合规范的情况(例如,它不会匹配
&#foo;
&123;
末尾的分号)

(?是一个“负lookback”,因此您可以将此正则表达式读取为匹配分号,而分号前面没有匹配
&#?[0-9a-zA-Z]+
(即,与符号、可选哈希和一个或多个字母数字)的子字符串。但是,lookbehind必须对它们可以匹配的字符数有一个上限,而
+
没有上限,因此必须使用有界重复计数,如
{1,5}
而不是无界的
+
。上限需要至少与您可能看到的最长实体引用一样长,如果您的数据可能包含任意实体引用,则必须使用类似字符串长度的内容作为上限

String[] keyValuePairs = theString.split(
    "(?<!&#?[0-9a-zA-Z]{1," + theString.length() + "});");

由于HTML实体只有两三个介于“&#”和“;”之间的数字,因此我使用了以下正则表达式:

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

(?因为HTML实体只有两到三个介于“&#”和“;”之间的数字,所以我使用了以下正则表达式:

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


(?您尝试了什么?您不能使用另一个分隔符(例如“|”)获取字符串吗“?@Axel不幸的是没有.@RohitJain我试着四处看看,但没有看到结果…我没有发布我的试用版,因为它们没有被编译成好的正则表达式。”pattern@Axel本例中的问题是
;;
表示分号字符……您尝试了什么?您不能用另一个分隔符(例如“|”)“?@Axel不幸的是没有.@RohitJain我试着四处看看,但没有看到结果…我没有发布我的试用版,因为它们没有被编译成好的正则表达式。”pattern@Axel本例中的问题是,
;;
表示分号字符…谢谢!我对正则表达式不在行,因此无法使用为了实现像您这样的解决方案…我刚刚发现了模式上的一个小问题。如果我像您发布的那样编写它,我会得到异常“exception in thread”main java.util.regex.PatternSyntaxException:Look behind group在索引18附近没有明显的最大长度(?@MiguelRibeiro Java显然继承了Perl限制,即lookbehinds必须具有有界长度。我对答案进行了编辑,并给出了一些建议。刚刚检查……似乎,即使有限制,Android SDK也会抛出相同的异常……它使用Java 1.5(并使用Java 1.6的spike解决方案进行了测试)因此,我不知道我是否遗漏了任何细节…@MiguelRibeiro在这种情况下,你必须自己实现循环逻辑,而不是在一个带有
字符串的正则表达式中实现。拆分
谢谢!我对正则表达式不在行,也无法实现像你这样的解决方案…我只是发现了模式上的一个小故障。如果我像y一样编写它ou发布了它,我在线程“main”java.util.regex.PatternSyntaxException中得到了异常“exception”:Look-behind组在索引18附近没有明显的最大长度(?@MiguelRibeiro Java显然继承了Perl限制,即lookbehinds必须具有有界长度。我对答案进行了编辑,并给出了一些建议。刚刚检查……似乎,即使有限制,Android SDK也会抛出相同的异常……它使用Java 1.5(并使用Java 1.6的spike解决方案进行了测试)所以我不知道我是否遗漏了任何细节…@MiguelRibeiro在这种情况下,你必须自己实现循环逻辑,而不是在一个正则表达式中使用
String.split