我要做的是向后分割一个字符串。意思是从右到左。
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);
但是你会怎么做呢?原因是,因为它可能是一个两个名字的城市,所以额外的''会打破城市名称。
答案 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();
所以我们
正如我所说的,一个小小的凌乱,但它会得到你想要的阵列。如果你不需要它是那种格式的数组,你显然可以简单地简化上面的代码。
您也可以这样做:
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);
}