如何使用一些分隔符拆分字符串,但不在Java中删除该分隔符?

2022-08-31 12:24:50

我在拆分时遇到了问题。String

我想用一些分隔符拆分一个,但不丢失该分隔符。String

当我们在Java中使用方法时,它会从中拆分但删除分隔符部分。我不希望这种情况发生。somestring.split(String separator)StringString

我想要如下结果:

String string1="Ram-sita-laxman";
String seperator="-";
string1.split(seperator);

输出:

[Ram, sita, laxman]

但是我想要如下结果:

[Ram, -sita, -laxman]

有没有办法获得这样的输出?


答案 1
string1.split("(?=-)");

这有效,因为实际上需要正则表达式。你实际看到的是一个“零宽度正前瞻”。split

我很想解释更多,但我的女儿想玩茶话会。:)

编辑:返回!

为了解释这一点,我将首先向您展示一个不同的操作:split

"Ram-sita-laxman".split("");

这会在每个长度为零的字符串上拆分字符串。每个字符之间都有一个长度为零的字符串。因此,结果是:

["", "R", "a", "m", "-", "s", "i", "t", "a", "-", "l", "a", "x", "m", "a", "n"]

现在,我修改了我的正则表达式 (),使其仅在零长度字符串后跟破折号时才匹配它们""

"Ram-sita-laxman".split("(?=-)");
["Ram", "-sita", "-laxman"]

在该示例中,表示“前瞻”。更具体地说,它的意思是“积极的展望”。为什么是“积极的”?因为您还可以有前瞻 (),它将在每个后跟破折号的零长度字符串上拆分:?=?!

"Ram-sita-laxman".split("(?!-)");
["", "R", "a", "m-", "s", "i", "t", "a-", "l", "a", "x", "m", "a", "n"]

您还可以使用正的 lookbehind (),它将在前面有一个短划线的每个长度为零的字符串上拆分:?<=

"Ram-sita-laxman".split("(?<=-)");
["Ram-", "sita-", "laxman"]

最后,您还可以使用负 lookbehind (),它将在前面没有破折号的每个长度为零的字符串上拆分:?<!

"Ram-sita-laxman".split("(?<!-)");
["", "R", "a", "m", "-s", "i", "t", "a", "-l", "a", "x", "m", "a", "n"]

这四个表达式统称为 lookround 表达式。

奖励:将它们放在一起

我只是想展示我最近遇到的一个例子,它结合了个外观表达式。假设您希望将大写字母标识符拆分为其令牌:

"MyAwesomeClass" => ["My", "Awesome", "Class"]

您可以使用以下正则表达式完成此操作:

"MyAwesomeClass".split("(?<=[a-z])(?=[A-Z])");

这将对每个长度为零的字符串进行拆分,该字符串前面有一个小写字母 (),后跟一个大写字母 ()。(?<=[a-z])(?=[A-Z])

此技术也适用于驼峰大小写标识符。


答案 2

这有点狡猾,但你可以使用替换函数引入一个虚拟分隔符。我不知道Java方法,但在C#中它可能是这样的:

string1.Replace("-", "#-").Split("#");

当然,您需要选择一个虚拟分隔符,该分隔符保证不会位于字符串中的其他任何位置。