我需要帮助来开发一个逻辑来分割字符串,但只是基于字符串的最后两个分隔符。
示例输入:
string s1 = "Dog \ Cat \ Bird \ Cow";
string s2 = "Hello \ World \ How \ Are \ You";
string s3 = "I \ am \ Peter";
预期产出:
string[] newS1 = "Dog Cat", "Bird", "Cow"
string[] newS2 = "Hello World How", "Are", "You"
string[] newS3 = "I", "am", "Peter"
因此,正如您所看到的,我只想将字符串拆分为最后2个“\”,并且最后2个“\”之前的所有其他内容将连接成一个字符串。
我尝试了.Split方法,但它只是将字符串中的每个“\”分开。
编辑:如果字符串少于2“\”,它将根据它具有的任何内容进行分割
更新:哇,这些都是一堆有趣的解决方案!非常感谢你!
答案 0 :(得分:5)
试试这个:
var parts = s1.Split(new[] { " \\ " }, StringSplitOptions.None);
var partsCount = parts.Count();
var result = new[] { string.Join(" ", parts.Take(partsCount - 2)) }.Concat(parts.Skip(partsCount - 2));
答案 1 :(得分:5)
提供regex解决方案:
var output = Regex.Split(input, @"\s*\\\s*([^\\]*?)\s*\\\s*(?=[^\\]*$)");
此拆分找到倒数第二个元素并将其拆分,但会将其捕获到一个组中,以便它将包含在输出数组中。
对于输入"Dog \ Cat \ Bird \ Cow"
,这将产生{ "Dog \ Cat", "Bird", "Cow" }
。如果您还需要从可以通过简单替换完成的第一个元素中删除\
:
output[0] = output[0].Replace(" \\", "");
更新:此版本将只使用一个分隔符正确处理字符串:
var output = Regex.Split(str, @"\s*\\\s*([^\\]*?)\s*\\\s*(?=[^\\]*$)|(?<=^[^\\\s]*)\s*\\\s*(?=[^\\\s]*$)");
更新:要匹配其他分隔符,例如空白,"~"
和"%"
,您可以使用character class:
var output = Regex.Split(str, @"(?:[%~\s\\]+([^%~\s\\]+?)[%~\s\\]+|(?<=^[^%~\s\\]+)[%~\s\\]+)(?=[^%~\s\\]+$)");
此正则表达式的结构比前一个更简单,因为它表示类[%~\s\\]
中作为分隔符的一个或多个字符的任何序列,以及否定字符类中的一个或多个字符的任何序列[^%~\s\\]
成为细分受众群。请注意,\s
表示'whitespace' character。
您也可以使用以下方法进一步简化:
var output = Regex.Split(str, @"(?:\W+(\w+)\W+|(?<=^\w+)\W+)(?=\w+$)");
\w
匹配任何'word' character(字母,数字或下划线),\W
匹配任何'non-word' character。
答案 2 :(得分:2)
您希望每个<space>\<space>
上的字符串Split
:
string input = @"Dog \ Cat \ Bird \ Cow";
string[] parts = input.Split(new string[]{@" \ "},
StringSplitOptions.None);
然后Join
除了最后两部分之外,所有内容都有空格:
// NOTE: Check that there are at least 2 parts.
string part0 = String.Join(" ", parts.Take(parts.Length - 2));
string part1 = parts[parts.Length - 2];
string part2 = parts[parts.Length - 1];
这将为您提供三个字符串,您可以将它们放入数组中。
string[] newParts = new []{ part0, part1, part2 };
在这个例子中:
new [] { "Dog Cat", "Bird", "Cow" }
答案 3 :(得分:1)
如何简单地获取split的输出,然后获取前N-2个项目并重新连接,然后创建3个项目的新字符串数组,首先输出Join,第二个是第一个分割的项目N-1,以及第三是第一次分裂的N.我认为这将完成你想要做的事情。
答案 4 :(得分:1)
有趣的问题。我最初的解决方案是:
String[] tokens = theString.Split("\\");
String[] components = new String[3];
for(int i = 0; i < tokens.length - 2; i++)
{
components[0] += tokens[i];
}
components[1] = tokens[tokens.length - 2];
components[2] = tokens[tokens.length - 1];
答案 5 :(得分:-1)
从字符串的末尾循环并计算分隔符,直到遇到两个。 在先前设置为-1的2个变量中记录索引位置。
循环之后,如果第一个var为-1,则没有任何反应,返回整个字符串。
如果第二个var为-1,则创建2个字符串的数组,使用子字符串拆分并返回。
创建3个字符串的数组,使用来自两个vars的信息进行拆分,返回。
希望您理解我的伪代码,如果您需要帮助,请给我评论。