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

在Java中,如何使用一些分隔符拆分字符串,但不删除该分隔符?,java,regex,string,split,Java,Regex,String,Split,我在拆分字符串时遇到问题 我想用一些分隔符拆分字符串,但不丢失该分隔符 当我们在Java中使用somestring.split(字符串分隔符)方法时,它会分割字符串,但会从字符串中删除分隔符部分。我不想发生这种事 我希望得到如下结果: String string1="Ram-sita-laxman"; String seperator="-"; string1.split(seperator); 输出: [Ram, sita, laxman] 但我希望得到如下结果: [Ram, -sita,

我在拆分
字符串时遇到问题

我想用一些分隔符拆分
字符串
,但不丢失该分隔符

当我们在Java中使用
somestring.split(字符串分隔符)
方法时,它会分割
字符串
,但会从
字符串
中删除分隔符部分。我不想发生这种事

我希望得到如下结果:

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("(?!-)");
["", "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"]
您还可以使用正向查找(
分隔符=“-”;
String[]splitstrings=string1.split(分隔符);

对于(int i=1;iAdam一针见血!我用他的答案找出了如何将文件名文本从文件对话框浏览器插入到富文本框中。我遇到的问题是在“\”处添加新行时在文件字符串中。string.split命令在\处拆分并删除它。混合使用Adam的代码后,我能够在文件名中的每个\之后创建一行新行

以下是我使用的代码:

OpenFileDialog fd = new OpenFileDialog();
        fd.Multiselect = true;
        fd.ShowDialog();

        foreach (string filename in fd.FileNames)
        {
            string currentfiles = uxFiles.Text;
            string value = "\r\n" + filename;

     //This line allows the Regex command to split after each \ in the filename. 

            string[] lines = Regex.Split(value, @"(?<=\\)");

            foreach (string line in lines)
            {
                uxFiles.Text = uxFiles.Text + line + "\r\n";
            }
        }
OpenFileDialog fd=newopenfiledialog();
fd.Multiselect=true;
fd.ShowDialog();
foreach(fd.FileNames中的字符串文件名)
{
字符串currentfiles=uxFiles.Text;
字符串值=“\r\n”+文件名;
//此行允许Regex命令在文件名中的每个\之后拆分。

string[]line=Regex.Split(值@”(?+1:哇,从来都不知道regexp有这么强大!+1非常优雅的解决方案你能举个例子,说明你将如何在hypens之前和之后进行环顾,即制作
ram、,,sita、,,laxman
与你女儿的茶话会是解决世界面临的真正问题的美丽解决方案。我同意这个答案。哪个眉毛SER支持这种?
“Ram sita laxman”。split((?危险(即使我经常这么做:-))替换需要额外的时间,所以这种方式不是最优的!
"MyAwesomeClass" => ["My", "Awesome", "Class"]
"MyAwesomeClass".split("(?<=[a-z])(?=[A-Z])");
seperator="-";
String[] splitstrings = string1.split(seperator);
for(int i=1; i<splitstring.length;i++)
{
   splitstring[i] = seperator + splitstring[i];
}
OpenFileDialog fd = new OpenFileDialog();
        fd.Multiselect = true;
        fd.ShowDialog();

        foreach (string filename in fd.FileNames)
        {
            string currentfiles = uxFiles.Text;
            string value = "\r\n" + filename;

     //This line allows the Regex command to split after each \ in the filename. 

            string[] lines = Regex.Split(value, @"(?<=\\)");

            foreach (string line in lines)
            {
                uxFiles.Text = uxFiles.Text + line + "\r\n";
            }
        }