Java拆分CSV忽略HTML字符
我需要用分号分割字符串,忽略可能作为HTML字符出现的分号。 例如,给定字符串:Java拆分CSV忽略HTML字符,java,regex,csv,split,Java,Regex,Csv,Split,我需要用分号分割字符串,忽略可能作为HTML字符出现的分号。 例如,给定字符串: id=com.google.android;keywords=Android;Operating System;Phone;versions=Gingerbread;ICS;JB 我需要将其分为: id = com.google.android keywords=Android;Operating System;Pho
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
有没有办法做到这一点?类似正则表达式的(?)可能会做到。这将阻止匹配终止实体引用或字符引用的分号,尽管它也会捕获一些从技术上讲不符合规范的情况(例如,它与&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