10.5 如何在保留定界符(分隔符)的情况下正确拆分字符串? | Java Debug 笔记

515 阅读1分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

**提问:如何在保留定界符的情况下正确拆分字符串? **

我有一个多行字符串,该字符串由一组不同的定界符定界:

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

我可以使用String.split将该字符串拆分为各个部分,但String.split似乎无法获取与定界符regex匹配的实际字符串。即他不会保留定界符本身

换句话说,运行代码后我会得到

Text1
Text2
Text3
Text4

但这并不是我想要的,我想要的是:

Text1
DelimiterA
Text2
DelimiterC
Text3
DelimiterB
Text4

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

回答1:

您可以使用Lookahead和Lookbehind。像这样:

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的问题。 现在我要做一件事的是缓解这种情况,即创建一个变量,该变量的名称表示正则表达式的作用,并使用Java String格式来帮助实现这一点。 像这样:

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

文章翻译至Stack Overflow:stackoverflow.com/questions/2…