基于最后N个分隔符分割字符串

时间:2014-02-19 19:07:51

标签: c#

我需要帮助来开发一个逻辑来分割字符串,但只是基于字符串的最后两个分隔符。

示例输入:

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“\”,它将根据它具有的任何内容进行分割

     
    

更新:哇,这些都是一堆有趣的解决方案!非常感谢你!

  

6 个答案:

答案 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的信息进行拆分,返回。

希望您理解我的伪代码,如果您需要帮助,请给我评论。