在第一个数字处拆分字符串然后返回2个字符串

时间:2017-10-06 00:04:08

标签: c# arrays string

在将字符串拆分为2个部分以便从第一个数字中进行调整时遇到一些麻烦。它目前正在分裂第一个空间,但这不会长期工作,因为城市也有空间。

当前代码:

var string = "Chicago 1234 Anytown, NY"
var commands = parameters.Split(new[] { ' ' }, 2);
var originCity = commands[0];
var destination = commands[1];

这对于一个只有一个名字的城市来说非常有用,但我打破了:

var string = "Los Angeles 1234 Anytown, NY"

我尝试了几种不同的方法,但我还没有能够解决这些问题。关于能够返回2个字符串的任何想法如下:

originCity = Los Angeles
destination = 1234 Anytown, NY

3 个答案:

答案 0 :(得分:3)

您无法使用.Split()

相反,您需要找到第一个数字的索引。您可以将.indexOfAny()与数组(技术上为char[]数组)一起使用来执行此操作。

int numberIndex = address.IndexOfAny("0123456789".ToCharArray())

然后你可以捕获两个substrings;一个在索引之前,另一个在之后。

string before = line.Substring(0, numberIndex);
string after = line.Substring(numberIndex);

答案 1 :(得分:1)

您可以使用正则表达式。在下面,匹配是正则表达式结果中的第一个匹配。

var match = Regex.Match(s, "[0-9]");
if (match.Success)
{
    int index = match.Index;
    originCity = s.Substring(0, index);
    destination = s.Substring(index, s.Length - index);
}

或者你可以自己做:

int index = 0;
foreach (char c in s)
{
    int result;
    if (int.TryParse(c, out result))
    {
        index = result;
        break;
    }
    //or if (char.IsDigit()) { index = int.Parse(c); break; }
 }
 ...

答案 2 :(得分:-1)

你应该看看使用正则表达式是否会在这里做你需要的。至少使用您显示的样本数据,表达式为:

(\D+)(\d+)(\D+)

将结果分组为非数字字符,直到第一个数字字符,数字字符,直到遇到非数字,然后是其余的非数字字符。以下是它在代码中的使用方式:

var pattern = @"(\D+)(\d+)(\D+)"; 
var input = "Los Angeles 1234 Anytown, NY"; 
var result = Regex.Match(input, pattern); 
var city = result.Groups[1]; 
var destination = $"{result.Groups[2]} {result.Groups[3]}";

这种情况在加利福尼亚州29 Palms或者数字包含逗号,小数等情况下会分崩离析,所以它肯定不是银弹,但我不知道你的数据,这对于这样一个简单的解决方案可能没问题