C#如何向后拆分字符串?

时间:2011-07-13 10:52:40

标签: c#

我要做的是向后分割一个字符串。意思是从右到左。

string startingString = "<span class=\"address\">Hoopeston,, IL 60942</span><br>"

我通常会这样做。

string[] splitStarting = startingString.Split('>');

所以我的splitStarting[1]= "Hoopeston,, IL 60942</span"

然后我会做

string[] splitAgain = splitStarting[1].Split('<');

所以splitAgain[0]= "Hoopeston,, IL 60942"

现在这就是我想做的事情,我希望通过''(空格)拆分为''的最后2个实例。

例如,我的数组会像这样返回:

[0]="60942"

[1]="IL"

[2] = "Hoopeston,,"

为了使这更难,我只想要前两个反向分裂,所以通常我会做这样的事情

string[] splitCity,Zip = splitAgain[0].Split(new char[] { ' ' }, 3);

但是你会怎么做呢?原因是,因为它可能是一个两个名字的城市,所以额外的''会打破城市名称。

8 个答案:

答案 0 :(得分:2)

带有命名组的

正则表达式使事情变得更加简单。无需反转字符串。只要掏出你想要的东西。

var pattern = @">(?<city>.*) (?<state>.*) (?<zip>.*?)<";
var expression = new Regex(pattern);
Match m = expression .Match(startingString);
if(m.success){
    Console.WriteLine("Zip: " + m.Groups["zip"].Value);
    Console.WriteLine("State: " + m.Groups["state"].Value);
    Console.WriteLine("City: " + m.Groups["city"].Value);
}

应该给出以下结果:

 Found 1 match:

   1. >Las Vegas,, IL 60942< has 3 groups:
         1. Las Vegas,, (city)
         2. IL (state)
         3. 60942 (zip)

String literals for use in programs:

C#
    @">(?<city>.*) (?<state>.*) (?<zip>.*?)<"

答案 1 :(得分:0)

怎么样

using System.Linq
...
splitAgain[0].Split(' ').Reverse().ToArray()

-edit -

确定错过了关于多字词引用的最后一部分,你仍然可以使用linq:

splitAgain[0].Split(' ').Reverse().Take(2).ToArray()

会得到你的

[0]="60942" 
[1]="IL"

虽然这个城市不会包含在这里,你仍然可以在一个声明中完成整个事情,但它会有点混乱:

var elements = splitAgain[0].Split(' ');
var result = elements
  .Reverse()
  .Take(2)
  .Concat( new[ ] { String.Join( " " , elements.Take( elements.Length - 2 ).ToArray( ) ) } )
  .ToArray();

所以我们

  • 拆分字符串,
  • 扭转它,
  • 取两个第一个元素(最后两个元素)
  • 然后我们创建一个包含单个字符串元素的新数组,并从原始元素数组中减去最后2个元素(Zip和邮政编码)来创建该字符串

正如我所说的,一个小小的凌乱,但它会得到你想要的阵列。如果你不需要它是那种格式的数组,你显然可以简单地简化上面的代码。

您也可以这样做:

var result = new[ ]{ 
               elements[elements.Length - 1], //last element
               elements[elements.Length - 2], //second to last
               String.Join( " " , elements.Take( elements.Length - 2 ).ToArray( ) ) //rebuild original string - 2 last elements
             };

答案 2 :(得分:0)

起初我以为你应该使用Array.Reverse()方法,但我现在看到它是''(空格)上的分裂问题。 你的第一个值可能有一个空格(即“纽约”),所以你不想在空格上分割。

如果您知道字符串中只有3个值,那么您可以使用String.LastIndexOf(“”)然后使用String.SubString()来修剪它然后再次执行相同的操作来查找中间值,然后你将留下第一个值,有或没有空格。

答案 3 :(得分:0)

我认为你应该这样做:

var s = splitAgain[0];
var zipCodeStart = s.LastIndexOf(' ');
var zipCode = s.Substring(zipCodeStart + 1);
s = s.Substring(0, zipCodeStart);
var stateStart = s.LastIndexOf(' ');
var state = s.Substring(stateStart + 1);
var city = s.Substring(0, stateStart );
var result = new [] {zipCode, state, city};

结果将包含您请求的内容。

答案 4 :(得分:0)

一种可能的解决方案 - 不是最优但容易编码 - 是反转字符串,然后使用“正常”功能拆分该字符串,然后反转每个单独的拆分部分。

另一种可能的解决方案是使用正则表达式。

答案 5 :(得分:0)

如果斯普利特可以做所有事情那么会有太多的重载会让人感到困惑。

不要使用split,只需使用子字符串和lastIndexOf自定义代码。

  string str = "Hoopeston,, IL 60942";
  string[] parts = new string[3];
  int place = str.LastIndexOf(' ');
  parts[0] = str.Substring(place+1);
  int place2 = str.LastIndexOf(' ',place-1);
  parts[1] = str.Substring(place2 + 1, place - place2 -1);
  parts[2] = str.Substring(0, place2);

答案 6 :(得分:0)

您可以使用正则表达式来获取标记内部字符串的三个部分,并使用LINQ扩展以正确的顺序获取字符串。

示例:

string startingString = "<span class=\"address\">East St Louis,, IL 60942</span><br>";

string[] city =
  Regex.Match(startingString, @"^.+>(.+) (\S+) (\S+?)<.+$")
  .Groups.Cast<Group>().Skip(1)
  .Select(g => g.Value)
  .Reverse().ToArray();

Console.WriteLine(city[0]);
Console.WriteLine(city[1]);
Console.WriteLine(city[2]);

输出:

60942
IL
East St Louis,,

答案 7 :(得分:0)

面临与音频FileName约定类似的问题。

遵循这种方式:String to Array转换,反向和拆分,并将每个部分反向恢复正常。

        char[] addressInCharArray = fullAddress.ToCharArray();
        Array.Reverse(addressInCharArray);

        string[] parts = (new string(addressInCharArray)).Split(new char[] { ' ' }, 3);
        string[] subAddress = new string[parts.Length];

        int j = 0;
        foreach (string part in parts)
        {
            addressInCharArray = part.ToCharArray();
            Array.Reverse(addressInCharArray);
            subAddress[j++] = new string(addressInCharArray);
        }