取.split ('')和最后一个或排除最后一个项目

本文关键字:最后一个 排除 项目 split | 更新日期: 2023-09-27 18:18:26

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

内容可以像这样

在42号登机口

我需要将数字从其余部分中分离出来,并将"At the gates"添加到属性"Street"中,将"42"添加到属性"number"中

我已经用这个方法解决了这个问题:

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

我如何使用Linq拆分这个字符串并仅排除最后一个数字以获得街道?

亲切的问候

取.split ('')和最后一个或排除最后一个项目

使用regex,这样您也可以灵活地满足您的需求。

下面是一个示例:

    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
    }

分割字符串在这里有点太多了。您只需要找到最后出现的" "并在此位置进行分割:

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

如果你需要更大的灵活性,也可以考虑使用正则表达式

你可以这样做:

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

我会使用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))