为了账号安全,请及时绑定邮箱和手机立即绑定

如何用一些分隔符拆分String而不在Java中删除该分隔符?

/ 猿问

如何用一些分隔符拆分String而不在Java中删除该分隔符?

慕容4345310 2019-12-13 10:25:35

我在拆分时面临问题String。


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


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


我想要如下结果:


String string1="Ram-sita-laxman";

String seperator="-";

string1.split(seperator);

输出:


[Ram, sita, laxman]

但我希望结果如下所示:


[Ram, -sita, -laxman]

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


查看完整描述

3 回答

?
九州编程

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


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

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


查看完整回答
反对 回复 2019-12-13
?
慕娘9325324

亚当砸中了头!我用他的答案来弄清楚如何将文件对话框浏览器中的文件名文本插入富文本框。我遇到的问题是在文件字符串的“ \”处添加新行时。string.split命令在\处分割并删除。在混合使用亚当的代码后,我能够在文件名中的每个\之后创建新行。


这是我使用的代码:


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

            }

        }


查看完整回答
反对 回复 2019-12-13
?
繁花不似锦

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

这四个表达式统称为环视表达式。


奖励:将它们放在一起

我只是想展示一个我最近遇到的示例,该示例结合了两个环视表达式。假设您希望将一个CapitalCase标识符分成其令牌:


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

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


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

这会在每个零长度的字符串上分割,该字符串前面是小写字母((?<=[a-z])),然后是大写字母((?=[A-Z]))。


此技术还可以使用camelCase标识符。


查看完整回答
反对 回复 2019-12-13

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信