c#如何向后拆分字符串

本文关键字:拆分 字符串 | 更新日期: 2023-09-27 18:02:10

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

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"

现在这就是我想做的,我想用' '(一个空格)来分割' '的最后两个实例。

例如,我的数组将返回如下:

[0]="60942"
[1]="IL"
[2] = "Hoopeston,,"

为了使这更加困难,我只想要前两个反向分割,所以通常我会这样做

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

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

c#如何向后拆分字符串

带命名组的正则表达式使事情简单得多。不需要反转字符串。把你想要的拔出来。

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>.*?)<"

一个可能的解决方案-不是最优的,但易于编码-是反转字符串,然后使用"normal"函数拆分该字符串,然后反转每个单独的拆分部分。

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

我认为你应该这样做:

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

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

如果Split可以做所有的事情,那么就会有太多的重载,这会让人感到困惑。

不要使用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);

您可以使用正则表达式在标记中获得字符串的三个部分,并使用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,,

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

编辑——

ok错过了关于多词引用的最后一部分,但是你仍然可以使用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();

所以我们是

  • 拆分字符串,
  • 扭转它,
  • 取前两个元素(最后两个元素为原值)
  • 然后我们创建一个包含单个字符串元素的新数组,并使用原始元素数组减去最后两个元素(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
             };

起初我认为你应该使用Array.Reverse()方法,但我现在看到,这是分裂的' '(空间),这是问题。你的第一个值可以有一个空格(例如"New York"),所以你不想在空格上分割。

如果你知道字符串中只有3个值,那么你可以使用string。LastIndexOf(" "),然后使用String.SubString()来修剪掉,然后再做同样的事情来找到中间值,然后你将留下第一个值,有或没有空格

在音频文件名约定中遇到了类似的问题。

按以下方式执行:字符串到数组的转换,反转和分割,并将每个部分反转回正常。

        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);
        }