获取.Split('')的所有元素并取最后一个OR排除最后一项

时间:2013-06-13 11:32:53

标签: c# linq

我有一个不正确的地址字段,我正在从excel中读取。我需要拆分这个字段并将这两个值输入两个列表属性。

内容可能是这样的

  

在大门42

我需要从其余部分拆分数字,并将“在门口”添加到物业“街道”,将“42”添加到物业“号码”

我用这个数字解决了问题:

Number = Convert.ToString(ws.Cells[j + 3, i + 2].Value).Split(' ').LastOrDefault()

如何将此字符串与Linq分开并只排除最后一个数字以获取街道?

亲切的问候

4 个答案:

答案 0 :(得分:2)

分裂字符串在这里有点太多了。你只需找到“”的最后一次出现并在这个位置拆分:

var address = "At the gates 42";
var idx = address.LastIndexOf(' ');
var street = address.Substring(0, idx);
var number = address.Substring(idx + 1);

如果您需要更多灵活性,还可以考虑使用正则表达式。

答案 1 :(得分:2)

使用正则表达式,这样您也可以灵活地满足您的需求。

以下是一个示例:

    static void Main(string[] args)
    {
        Regex regex = new Regex(@"(?<words>[A-Za-z ]+)(?<digits>[0-9]+)");

        string input = "At the gates 42";

        var match = regex.Match(input);
        var a = match.Groups["words"].Value; //At the gates 
        var b = match.Groups["digits"].Value; //42
    }

答案 2 :(得分:0)

你可以这样做:

String[] sa = Convert.ToString(ws.Cells[j + 3, i + 2].Value).Split(' ');
Int32 number = Convert.ToInt32(sa[sa.Length - 1]);
String street = String.Join(" ", sa.Take(sa.Length - 1));

答案 3 :(得分:0)

我会使用LastIndexOf(如果您可以安全地假设您的门牌号码没有空格):

var original = Convert.ToString(ws.Cells[j + 3, i + 2].Value).Split().LastOrDefault()
var street = original.Substring(1, original.LastIndexOf(' '))
var number = original.Substring(original.LastIndexOf(' ') + 1)

请注意,让Excel为您完成工作可能更容易,但您可以在工作表中使用公式来执行相同的功能,所以......

这为您提供街道名称(假设您的原始值在单元格A1中,否则只替换所有出现的A1):

=MID(A1,1,LOOKUP(9.9999999999E+307,FIND(" ",A1,ROW($1:$1024)))-1)

这会给你一个数字:

=MID(A1,LOOKUP(9.9999999999E+307,FIND(" ",A1,ROW($1:$1024)))+1,LEN(A1))