[英]How can I pull all Numbers (as int) out of a string? c#
我有一个长字符串,我想循环遍历它并按顺序提取所有int值。 这看起来很简单,但我似乎无法弄明白。
string raw = "I am a string and I have some numbers 3 45 333 2 39 inside of me 1839 9303, and I'd like to get these numbers into 9 -10 00 9e09 into a string[] or something else";
int[] justNumbers = raw.?????
使用C#.NET 3.5并在必要时访问Regex和Linq。 谢谢。
最终结果将是一长串的整数。 即
List<int> numbers = new List<int>();
我最终使用了什么(不是最有效,但工作)
#region mysolution
numbers = new List<int>();
foreach (char item in raw)
{
if (item.ToString() == "0")
{
numbers.Add(Convert.ToInt32(item.ToString()));
}
else if (item.ToString() == "1")
{
numbers.Add(Convert.ToInt32(item.ToString()));
}
else if (item.ToString() == "2")
{
numbers.Add(Convert.ToInt32(item.ToString()));
}
else if (item.ToString() == "3")
{
numbers.Add(Convert.ToInt32(item.ToString()));
}
else if (item.ToString() == "4")
{
numbers.Add(Convert.ToInt32(item.ToString()));
}
else if (item.ToString() == "5")
{
numbers.Add(Convert.ToInt32(item.ToString()));
}
else if (item.ToString() == "6")
{
numbers.Add(Convert.ToInt32(item.ToString()));
}
else if (item.ToString() == "7")
{
numbers.Add(Convert.ToInt32(item.ToString()));
}
else if (item.ToString() == "8")
{
numbers.Add(Convert.ToInt32(item.ToString()));
}
else if (item.ToString() == "9")
{
numbers.Add(Convert.ToInt32(item.ToString()));
}
}
#endregion
类似的东西:(未经测试)
var items = raw.Split(' ');
var integers = new List<int>();
foreach(var i in items){
int test = 0;
if(int.TryParse(i, out test)){
integers.add(test);
}
}
编辑 : TryParse有一个重载 ,它作为参数,其中包括System.Globalization.NumberStyles的按位比较。 有了这个重载,你可以指定它可以接受哪些类型的整数字符串( AllowExponent
就是其中之一),所以我想,如果没有测试过 , 9e09
会起作用。 :)
希望这可以帮助!
基于正则表达式的方法看起来像这样:
Regex number = new Regex(@"-?\d+");
List<int> ints = number.Matches(raw)
.Cast<Match>()
.Select(m => Int32.Parse(m.Value))
.ToList();
但是,如果这意味着代表9 x 10 ^ 9,则不会处理9e09 - 它会将其解释为两个单独的数字,解析为9和9。
“疯狂”的Linq方式:
private static IEnumerable<int> GetNumbers(string str)
{
foreach (var st in str.Split(new string[]{" "},StringSplitOptions.RemoveEmptyEntries)
.Where(s => (s.ToCharArray()
.All(c => Char.IsDigit(c)))))
{
yield return Convert.ToInt32(st);
}
}
怎么样:
int[] xx = raw.Split( ' ' ).Where( ( s, o ) => Int32.TryParse( s, out o ) ).Select( p => Int32.Parse( p ) ).ToArray();
回应itowlson,如果有人担心溢出,可以借助临时变量在这种情况下使用tryparse:
int tmp = 0;
var result = (from m in new Regex(@"-?\d+").Matches(s).OfType<Match>()
let doesParse = int.TryParse(m.Value, out tmp)
where doesParse
select tmp).ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.