在不使用正则表达式的情况下将地址字符串拆分为数字和文本部分

时间:2013-01-01 13:19:04

标签: c#

我正在使用C#,我有很多包含地址的字符串,例如:

10 Downing Street
Birch Lane 7 
Palm Creek 8 Street
84 Chancellor Place
Battle on the Somme 56

等等。

我需要将这些字符串拆分为数字部分(例如“10”或“7”)和文本部分(例如“Downing street”或“Birch Lane”)。

哦,我被要求不要使用RegEx。

我已经尝试过将它们分割成这样的空格:

string s ="84 Chancellor place";
string [] words = s.Split(' ');

问题是(当然)它不会以相同的方式拆分所有字符串,所以我不能总是从文本的其余部分中排除数字(我不总是知道数字是在单词中[例如,0和文本部分在不同的单元格中,而不是融合在一起)。

我非常感谢您帮助找到提取数字的方法。

修改: 每个例子中的期望输出:

string1=10  string2=Downing Street
string1=7   string2=Birch Lane 
string1=8   string2=Palm Creek Street
string1=84  string2=Chancellor Place
string1=56  string2=Battle on the Somme

1 个答案:

答案 0 :(得分:1)

您可以使用此循环在List<Address>string.Split的帮助下初始化int.TryParse

List<Address> addresses = new List<Address>();
foreach (string str in strings)
{
    Address addr = new Address();
    addresses.Add(addr);
    int num, numIndex = int.MinValue;
    string[] tokens = str.Split(new[]{' '}, StringSplitOptions.RemoveEmptyEntries);
    for (int i = 0; i < tokens.Length; i++)
    {
        if (int.TryParse(tokens[i], out num))
        {
            addr.Number = num;
            numIndex = i;
            break;
        }
    }
    if (addr.Number.HasValue)
    {
        // join the rest with white-spaces to the street name skipping the number
        addr.Street = string.Join(" ", tokens.Where((s, i) => i != numIndex));
    }
    else
    {
        addr.Street = str;
    }
}

使用这个小班:

class Address
{
    public int Number { get; set; }
    public string Street { get; set; }
}

DEMO

免责声明:请注意,如果输入是任意的,则根本不是故障安全的。世界上有许多街道也包含数字,还有chars的数字,如“17a”。