你可以使用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]
最后一个是你想要的。
((?<=;)|(?=;))
等于选择之前;或之后的空字符;。
希望这可以帮助。
编辑 Fabian Steeg对可读性的评论有效。可读性始终是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, ";"));
...
}
...