一尘不染

Java拆分正在吞噬我的角色

java

我有这样的字符串String str = "la$le\\$li$lo"

我想将其拆分以获取以下输出"la","le\\$li","lo"。\ $是转义的$,因此应将其保留在输出中。

但是,当我做 str.split("[^\\\\]\\$")ÿ得到"l","le\\$l","lo"

从我得到的正则表达式匹配a $和i $然后删除。关于如何找回角色的任何想法吗?

谢谢


阅读 172

收藏
2020-09-08

共1个答案

一尘不染

使用零宽度匹配断言:

    String str = "la$le\\$li$lo";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<!\\\\)\\$")
    )); // prints "[la, le\$li, lo]"

正则表达式本质上是

(?<!\\)\$

它使用负向后看来断言没有在前\

也可以看看


断言分裂的更多示例

简单的句子拆分,保留标点符号:

    String str = "Really?Wow!This.Is.Awesome!";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<=[.!?])")
    )); // prints "[Really?, Wow!, This., Is., Awesome!]"

使用将长字符串拆分为固定长度的部分 \G

    String str = "012345678901234567890";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<=\\G.{4})")
    )); // prints "[0123, 4567, 8901, 2345, 6789, 0]"

使用后向/超前组合:

    String str = "HelloThereHowAreYou";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<=[a-z])(?=[A-Z])")
    )); // prints "[Hello, There, How, Are, You]"
2020-09-08