正则表达式从字符串C#中获取数字

时间:2018-10-11 15:02:14

标签: c# regex string list linq

我想将字符串坐标-54°32'17,420“拆分为每个数字,例如[54,32,17,420]。我正在使用

var longitudeSplitted = Regex.Split(longitutdeString, @"\D+")
    .Where(s => !string.IsNullOrWhiteSpace(s))
    .Distinct()
    .Select(int.Parse)
    .ToList();

它通常可以工作,但是当我有这样的坐标时,问题就出现了

-11°42'42,420“ 在这种情况下,我收到的名单只有3个数字[11,42,420]。 问题出在哪里?我不太了解这种行为。

3 个答案:

答案 0 :(得分:0)

正如在对该问题的评论中提到的那样,问题在于调用Distinct()

我给出的示例"-11°42'42,420"包含两次42,因此调用Distinct()删除了其中一个。

固定表达式为:

var longitudeSplitted = Regex.Split(longitutdeString, @"\D+")
    .Where(s => !string.IsNullOrWhiteSpace(s))
    .Select(int.Parse)
    .ToList();

此外,我的原始正则表达式@"\D+"无法包含负数的符号。我不得不重写为使用.Matches(...)而不是.Split(...)来包含符号。

因此正确的表达是这样的:

var longitudeSplitted = Regex.Matches(longitutdeString, @"[-+]?\d+").OfType<Match>()
    .Select(match => match.Value)
    .Where(s => !string.IsNullOrWhiteSpace(s))
    .Select(int.Parse)
    .ToList();

答案 1 :(得分:0)

这有效:

   var numRegex = new Regex(@"[\+\-0-9]+");
   var numMatches = numRegex.Matches("-11°42'43,440");

我将+/-保留在字符串中(以区分东西方),然后将数字更改为更独特的内容。您最终在numMatches.Items中使用4个字符串,每个字符串都可以解析为一个int。它也可以与“ -11°42'42,420”一起使用,但是我也想用唯一的数字对其进行测试

答案 2 :(得分:0)

这是您可以使用的帮助方法

private static List<int> ExtratctCordinates(string input)
{
    List<int> retObj = new List<int>();
    if(!string.IsNullOrEmpty(input))
    {
        int tempHolder;
        // Use below foreach with simple regex if you want sign insensetive data
        //foreach (Match match in new Regex(@"[\d]+").Matches(input))

        foreach (Match match in new Regex(@"[0-9\+\-]+").Matches(input))
        {
            if (int.TryParse(match.Value, out tempHolder))
            {
                retObj.Add(tempHolder);
            }
        }
    }
    return retObj;          
}

这是示例通话

List<int> op = ExtratctCordinates("-54°32'17,420\"");