java - 如何拆分字符串,但还要保留分隔符?

标签 java regex

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

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

关于java - 如何拆分字符串,但还要保留分隔符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2206378/

相关文章:

Java - 异常处理 - 正则表达式 - 匹配方法不适用于扫描仪输入

java - 将 SVN 修订版注入(inject)变量

java - 授权谷歌日历API适用于个人帐户,但不适用于谷歌域帐户

java - 运行 .jar 时 getResourceAsStream

正则表达式 - 从字符串中提取数字(带 2 位小数)

java - 正则表达式、字符串操作

java - 获取一个句子长字符串并扫描任何单词并保留 Java 中的所有特殊字符

java - 在单个表上映射两个类

c# - 正则表达式 - 通过注意缺少字符串然后插入它来匹配多行 block

r - 如何在 R 中使用正则表达式映射值