如何使用某些分隔符拆分String但不在Java中删除该分隔符?

时间:2010-12-11 11:12:29

标签: java regex string split

我在分割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]

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

5 个答案:

答案 0 :(得分:195)

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

这是有效的,因为split实际上需要regular expression。你实际看到的是“零宽度正向前瞻”。

我想解释更多,但我女儿想参加茶话会。 :)

编辑:返回!

为了解释这一点,我将首先向您展示一个不同的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"]

您还可以拥有正向后视?<=),它将在每个以短划线开头的零长度字符串上拆分:

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

最后,您还可以拥有负面后瞻?<!),它会在每个零长度字符串上分开,前面有短划线:< / p>

"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标识符。

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:2)

执行此操作的方法是拆分字符串,然后在每个提取的字符串的开头添加分隔符,但第一个字符串除外。

答案 3 :(得分:1)

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

这是符合LadaRaider答案的代码。

答案 4 :(得分:0)

亚当击中了头上的钉子!我用他的答案来弄清楚如何将文件对话框浏览器中的文件名文本插入到富文本框中。我遇到的问题是当我在文件字符串中的“\”处添加新行时。 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";
            }
        }

享受!

Walrusking

相关问题