为了账号安全,请及时绑定邮箱和手机立即绑定

如何拆分字符串,同时又保留分隔符?

如何拆分字符串,同时又保留分隔符?

吃鸡游戏 2019-06-03 13:02:56
如何拆分字符串,同时又保留分隔符?我有一个多行字符串,它由一组不同的分隔符分隔:(Text1)(DelimiterA)(Text2)(DelimiterC)(Text3)(DelimiterB)(Text4)我可以使用String.split,但我似乎无法得到实际的字符串,它与分隔符regex匹配。换句话说,这就是我得到的:Text1Text2Text3Text4这就是我想要的Text1DelimiterAText2DelimiterCText3DelimiterBText4是否有任何JDK方法使用分隔符regex拆分字符串,但也保留分隔符?
查看完整描述

4 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞


您可以使用“查找”和“查找”。就像这样:


System.out.println(Arrays.toString("a;b;c;d".split("(?<=;)")));

System.out.println(Arrays.toString("a;b;c;d".split("(?=;)")));

System.out.println(Arrays.toString("a;b;c;d".split("((?<=;)|(?=;))")));

你会得到:


[a;, b;, c;, d]

[a, ;b, ;c, ;d]

[a, ;, b, ;, c, ;, d]

最后一个是你想要的。


((?<=;)|(?=;))等于在前面选择一个空字符。;或之后;.


希望这能帮上忙。


编辑法比安·斯蒂格关于可读性的评论是有效的。对于RegEx来说,可读性始终是个问题。有一件事,我帮助缓解了这一点,就是创建一个变量,其名称表示regex所做的事情,并使用Java字符串格式进行帮助。就像这样:


static public final String WITH_DELIMITER = "((?<=%1$s)|(?=%1$s))";

...

public void someMethod() {

...

final String[] aEach = "a;b;c;d".split(String.format(WITH_DELIMITER, ";"));

...

}

...

这有点帮助。-D


查看完整回答
反对 回复 2019-06-03
?
慕仙森

TA贡献1827条经验 获得超8个赞

您想要使用查找器,并在零宽度匹配上拆分。以下是一些例子:

public class SplitNDump {
    static void dump(String[] arr) {
        for (String s : arr) {
            System.out.format("[%s]", s);
        }
        System.out.println();
    }
    public static void main(String[] args) {
        dump("1,234,567,890".split(","));
        // "[1][234][567][890]"
        dump("1,234,567,890".split("(?=,)"));   
        // "[1][,234][,567][,890]"
        dump("1,234,567,890".split("(?<=,)"));  
        // "[1,][234,][567,][890]"
        dump("1,234,567,890".split("(?<=,)|(?=,)"));
        // "[1][,][234][,][567][,][890]"

        dump(":a:bb::c:".split("(?=:)|(?<=:)"));
        // "[][:][a][:][bb][:][:][c][:]"
        dump(":a:bb::c:".split("(?=(?!^):)|(?<=:)"));
        // "[:][a][:][bb][:][:][c][:]"
        dump(":::a::::b  b::c:".split("(?=(?!^):)(?<!:)|(?!:)(?<=:)"));
        // "[:::][a][::::][b  b][::][c][:]"
        dump("a,bb:::c  d..e".split("(?!^)\\b"));
        // "[a][,][bb][:::][c][  ][d][..][e]"

        dump("ArrayIndexOutOfBoundsException".split("(?<=[a-z])(?=[A-Z])"));
        // "[Array][Index][Out][Of][Bounds][Exception]"
        dump("1234567890".split("(?<=\\G.{4})"));   
        // "[1234][5678][90]"

        // Split at the end of each run of letter
        dump("Boooyaaaah! Yippieeee!!".split("(?<=(?=(.)\\1(?!\\1))..)"));
        // "[Booo][yaaaa][h! Yipp][ieeee][!!]"
    }}

是的,这是最后一个模式中三层嵌套的断言。

相关问题

另见


查看完整回答
反对 回复 2019-06-03
  • 4 回答
  • 0 关注
  • 2036 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号