2010-08-13 51 views
9

是否有可能编写一个查询,我们可以从任何给定的字符串中获取可以解析为int的所有字符?使用LINQ来解析字符串中的数字

例如,我们有这样的字符串:"$%^DDFG 6 7 23 1"

结果必然是"67231"

而且即使是轻微的困难:我们能得到的只有前三个数字?

+2

确切的要求是不完全清楚,就用绳子like'123abc456def'发生什么,你想回到'123456','123'和'456',只是'123'还是'1'和'2'和'3'等? 最好的方法取决于确切的规格。 – 2010-08-13 21:03:24

+2

@保罗说,前三个数字。如何可能更准确?也许你会希望我写出300页的规格书和一些商业计划书和一堆图表? :) – Agzam 2010-08-16 13:35:43

回答

20

这会给你字符串

string result = new String("y0urstr1ngW1thNumb3rs". 
    Where(x => Char.IsDigit(x)).ToArray()); 

而且第3个字符使用.Take(3)ToArray()

+2

我不记得谁先回答这个解决方案。无论如何,我也在这里投票。除了Alan有更多的10k得分。 – Agzam 2010-08-16 13:41:03

10

以下应该工作。

var myString = "$%^DDFG 6 7 23 1"; 

//note that this is still an IEnumerable object and will need 
// conversion to int, or whatever type you want. 
var myNumber = myString.Where(a=>char.IsNumber(a)).Take(3); 

,如果你想23被视为一个单一的数字序列,目前还不清楚,或者2个不同的数字。我上面的解决方案假设你想要最终的结果是672

+0

类似的解决方案,因为我除了你waaay更快大声笑:) – Kelsey 2010-08-13 21:09:20

+3

你可以写的地方为'.Where(char.IsNumber)'我认为,因为它接受一个字符,并返回一个布尔 - 无需lamda。 – Rup 2010-08-13 23:47:11

+1

@Rup:很酷。学到了新东西。 – Alan 2010-08-14 00:04:39

1

这样的事情呢?

var yourstring = "$%^DDFG 6 7 23 1"; 
var selected = yourstring.ToCharArray().Where(c=> c >= '0' && c <= '9').Take(3); 
var reduced = yourstring.Where(char.IsDigit).Take(3); 
+0

这是一种很难阅读..不是吗? – Agzam 2010-08-16 13:38:16

+0

我想这可能是如果你不知道LINQ和lambda表达式。 – 2010-08-16 20:04:05

2
string testString = "$%^DDFG 6 7 23 1"; 
string cleaned = new string(testString.ToCharArray() 
    .Where(c => char.IsNumber(c)).Take(3).ToArray()); 

如果你想使用白名单(不总是号) :

char[] acceptedChars = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; 
string cleaned = new string(testString.ToCharArray() 
    .Where(c => acceptedChars.Contains(c)).Take(3).ToArray()); 
0

正则表达式:

private int ParseInput(string input) 
{ 
    System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@"\d+"); 
    string valueString = string.Empty; 
    foreach (System.Text.RegularExpressions.Match match in r.Matches(input)) 
     valueString += match.Value; 
    return Convert.ToInt32(valueString); 
} 

而且即使是轻微的困难:我们可以得到 只有前三个数字?

private static int ParseInput(string input, int take) 
    { 
     System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@"\d+"); 
     string valueString = string.Empty; 
     foreach (System.Text.RegularExpressions.Match match in r.Matches(input)) 
      valueString += match.Value; 
     valueString = valueString.Substring(0, Math.Min(valueString.Length, take)); 
     return Convert.ToInt32(valueString); 
    } 
3
public static string DigitsOnly(string strRawData) 
    { 
    return Regex.Replace(strRawData, "[^0-9]", ""); 
    } 
+0

那个太好了 – Agzam 2010-08-16 13:37:05

0
> 'string strRawData="12#$%33fgrt$%$5"; 
> string[] arr=Regex.Split(strRawData,"[^0-9]"); int a1 = 0; 
> foreach (string value in arr) { Console.WriteLine("line no."+a1+" ="+value); a1++; }' 

Output:line no.0 =12 
line no.1 = 
line no.2 = 
line no.3 =33 
line no.4 = 
line no.5 = 
line no.6 = 
line no.7 = 
line no.8 = 
line no.9 = 
line no.10 =5 
Press any key to continue . . .