怎么拆分字符串,但还要保留分隔符?

本教程将介绍如何拆分字符串,但还要保留分隔符?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

怎么拆分字符串,但还要保留分隔符? 教程 第1张

问题描述

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

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

我可以使用 String.split 将此字符串拆分为多个部分,但我似乎无法获得与分隔符正则表达式匹配的实际字符串.

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

文本1

Text2

Text3

Text4

这就是我想要的

文本1

分隔符A

Text2

分隔符C

Text3

分隔符B

Text4

是否有任何 JDK 方法可以使用分隔符正则表达式拆分字符串但同时保留分隔符?

推荐答案

可以使用正则表达式的前瞻和后瞻功能.

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]

最后一个就是你想要的.

((?<=;)|(?=;)) 等于选择;之前或;之后的空字符.

Fabian Steeg 关于可读性的评论是有效的.可读性始终是正则表达式的问题.为了使正则表达式更具可读性,我做的一件事是创建一个变量,其名称代表正则表达式的作用.您甚至可以放置占位符(例如 %1$s)并使用 Java 的 String.format 将占位符替换为您需要使用的实际字符串;例如:

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, ";"));
 ...
}

好了关于怎么拆分字符串,但还要保留分隔符?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。