如何拆分string与一些分隔符,但不删除在Java中的分隔符?

我正在分裂String中遇到问题。

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

当我们在Java中使用somestring.split(String separator)方法时,它将String拆分,但从String删除分隔符部分。 我不想要这样的事情发生。

我想要的结果如下所示:

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

输出:

 [Ram, sita, laxman] 

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

 [Ram, -sita, -laxman] 

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

 string1.split("(?=-)"); 

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

我想解释更多,但我女儿想参加茶会。 🙂

编辑:回来!

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

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

这将在每个零长度string上分割您的string。 每个字符之间都有一个零长度的string。 所以结果是:

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

现在,我修改我的正则expression式( "" ),只匹配零长度的string, 如果他们后面是短划线

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

在这个例子中, ?=意味着“向前看”。 更具体地说,这意味着“ 积极向前看”。 为什么是“积极的”? 因为你也可以有向前视( ?! ),它将在每一个零长度的string上被分割,

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

你也可以有一个积极的lookbehind?<= ),它将在每一个以破折号开头的零长度的string上进行拆分:

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

最后,你也可以使用反向倒序?<! ),它将在每个零长度的string之前进行拆分:

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

这四个expression式统称为lookaroundexpression式。

奖金:把他们放在一起

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

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

你可以使用这个正则expression式来完成这个:

 "MyAwesomeClass".split("(?<=[az])(?=[AZ])"); 

这将在每个以小写字母( (?<=[az]) )开头的零长度string上分割,后跟大写字母( (?=[AZ]) )。

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

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

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

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

做到这一点的方法是分割你的string,然后添加你的分隔符在每个提取的string,除了第一个开始。

 seperator="-"; String[] splitstrings = string1.split(seperator); for(int i=1; i<splitstring.length;i++) { splitstring[i] = seperator + splitstring[i]; } 

这是符合LadaRaider的答案的代码。

亚当击中了头部! 我用他的答案找出如何从文件对话框浏览器中插入文件名文本到一个丰富的文本框。 我遇到的问题是当我在文件string中的“\”添加一个新的行。 string.split命令在\分裂并删除它。 在使用Adam的代码混合后,我可以在文件名中的每个\之后创build一个新行。

这是我使用的代码:

 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"; } } 

请享用!

Walrusking