基于精确字符进行正则表达式拆分,除非在其前面加上反斜杠进行转义。

3
需要使用分隔符拆分字符串,但仅在分隔符之前没有反斜杠时才这样做。
例如:如果存在 abc \:abc,请勿将其拆分为 : 由于其前面有反斜杠。
如果该字符串为 abc : abc,则需要拆分为 abc, abc
分隔符可以是 :,|,& 等。

您是否想要能够转义反斜杠,例如 abc \\: def 分解为 abc \def - that other guy
嗨,这是一个有趣的测试用例。是的,\ 应该在一起使用,而在这种情况下应该使用 : 进行分割。 - Paulena
2个回答

3
使用反向预查作为分隔符:
String input = "abc \\:abc def : def";
String[] parts = input.split("(?<=[^\\\\]):");
                                    ^^^^ split on any non-slash
                                         followed by delimiter

IDEOne


@4castle,我测试了你的负向回顾后断言,似乎也能正常工作。感谢你的编辑。 - Tim Biegeleisen
谢谢,没问题。只是提醒一下楼主,我们答案的唯一区别在于正则表达式如何处理字符串开头的分隔符。例如,如果字符串是 :abc,你的代码不会分割它,而我的会。但这种情况可能永远不会发生。 - 4castle
你应该使用(?<!\\\\),因为它更简单,而且也适用于第一个字符作为分隔符的情况。如果你使用正向后查找,那么实际上必须有一个字符存在(我刚刚注意到4castle已经发布了这个...) - Bohemian
作为一个反对者,如果字符串以word:结尾,那么使用您的方法最后一个匹配项不会有分隔符吗? - Tim Biegeleisen
@tim 两种方式都会匹配并在尾随分隔符上拆分,但是 Java 的 split 命令会丢弃空的尾随元素(除非您使用具有大型或负 limit 的重载版本)。区别只存在于开始的位置,因为 ^ 不会匹配一个字符的 PLB。 - Bohemian

3
使用负向回顾后发现 (?<!...)。要匹配一个字面上的反斜杠\,你需要进行两次转义。一次是因为它是字符串文字而进行转义,再一次是因为它是正则表达式转义字符。
String[] parts = string.split("(?<!\\\\)[:,|&]");

另一个值得评论的不错的点是,回顾肯定但不消耗。这就是期望的行为,既要消耗实际的分隔符,同时保留非斜杠字符。 - Tim Biegeleisen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接