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);
但是你怎么反过来做呢?这样做的原因是,因为它可能是一个有两个名称的城市,所以一个额外的' '会打破城市名称。
带命名组的正则表达式使事情简单得多。不需要反转字符串。把你想要的拔出来。
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);
}