我在分割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]
有没有办法获得这样的输出?
答案 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)
以下是我使用的代码:
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