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

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

我有一个多行字符串,它由一组不同的分隔符分隔:

(Text1)(DelimiterA)(Text2)(DelimiterC)(Text3)(DelimiterB)(Text4)

我可以使用String.split,但我似乎无法得到实际的字符串,它与分隔符regex匹配。

换句话说,这就是我得到的:

  • Text1

  • Text2

  • Text3

  • Text4

这就是我想要的

  • Text1

  • DelimiterA

  • Text2

  • DelimiterC

  • Text3

  • DelimiterB

  • Text4

是否有任何JDK方法使用分隔符regex拆分字符串,但也保留分隔符?


吃鸡游戏
浏览 2037回答 4
4回答

拉丁的传说

您可以使用“查找”和“查找”。就像这样: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

慕仙森

您想要使用查找器,并在零宽度匹配上拆分。以下是一些例子:public&nbsp;class&nbsp;SplitNDump&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;void&nbsp;dump(String[]&nbsp;arr)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(String&nbsp;s&nbsp;:&nbsp;arr)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.format("[%s]",&nbsp;s); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dump("1,234,567,890".split(",")); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;"[1][234][567][890]" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dump("1,234,567,890".split("(?=,)"));&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;"[1][,234][,567][,890]" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dump("1,234,567,890".split("(?<=,)"));&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;"[1,][234,][567,][890]" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dump("1,234,567,890".split("(?<=,)|(?=,)")); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;"[1][,][234][,][567][,][890]" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dump(":a:bb::c:".split("(?=:)|(?<=:)")); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;"[][:][a][:][bb][:][:][c][:]" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dump(":a:bb::c:".split("(?=(?!^):)|(?<=:)")); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;"[:][a][:][bb][:][:][c][:]" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dump(":::a::::b&nbsp;&nbsp;b::c:".split("(?=(?!^):)(?<!:)|(?!:)(?<=:)")); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;"[:::][a][::::][b&nbsp;&nbsp;b][::][c][:]" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dump("a,bb:::c&nbsp;&nbsp;d..e".split("(?!^)\\b")); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;"[a][,][bb][:::][c][&nbsp;&nbsp;][d][..][e]" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dump("ArrayIndexOutOfBoundsException".split("(?<=[a-z])(?=[A-Z])")); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;"[Array][Index][Out][Of][Bounds][Exception]" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dump("1234567890".split("(?<=\\G.{4})"));&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;"[1234][5678][90]" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Split&nbsp;at&nbsp;the&nbsp;end&nbsp;of&nbsp;each&nbsp;run&nbsp;of&nbsp;letter &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dump("Boooyaaaah!&nbsp;Yippieeee!!".split("(?<=(?=(.)\\1(?!\\1))..)")); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;"[Booo][yaaaa][h!&nbsp;Yipp][ieeee][!!]" &nbsp;&nbsp;&nbsp;&nbsp;}}是的,这是最后一个模式中三层嵌套的断言。相关问题JavaSplit正在吞噬我的角色。在字符串拆分中能使用零宽度匹配正则表达式吗?如何用Java将CamelCase转换为人类可读的名称?后视中的反向引用另见正则表达式.info/查找
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java