如何分割字符串与一些分隔符,但没有在Java中删除该分隔符?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (53)

我在分裂时遇到问题String

我想分割一个String分隔符,但不会丢失分隔符。

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

我想要的结果如下所示:

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

输出:

[Ram, sita, laxman]

但我想要的结果如下所示:

[Ram, -sita, -laxman]

有没有办法像这样得到输出?

提问于
用户回答回答于

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

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

当然,你需要选择一个保证不在字符串中的其他位置的虚拟分隔符。

用户回答回答于
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"]

在那个例子中,?=意思是“前瞻”。更具体地说,它意味着“ 积极的前瞻”。为什么是“积极”?因为您也可以使用向lookahead(?!),它将在每个零长度的字符串上分割,但不会跟随破折号:

"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"]

最后,你还可以有负回顾后?<!),这将拆分对每零长度字符串不是前面是破折号:

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

这四个表达式统称为查找表达式。

我只是想展示一个我最近遇到的结合了两个环视表达式的例子。假设你想将一个CapitalCase标识符分割成它的标记:

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

你可以用这个正则表达式来完成这个工作

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

这将在每个以小写字母((?<=[a-z]))开头的零长度字符串上分割,后跟大写字母((?=[A-Z]))。

这项技术也适用于camelCase标识符。

扫码关注云+社区