我想将字符串坐标-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]。 问题出在哪里?我不太了解这种行为。
答案 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\"");