是否有可能编写一个查询,我们可以从任何给定的字符串中获取可以解析为int的所有字符?使用LINQ来解析字符串中的数字
例如,我们有这样的字符串:"$%^DDFG 6 7 23 1"
结果必然是"67231"
而且即使是轻微的困难:我们能得到的只有前三个数字?
是否有可能编写一个查询,我们可以从任何给定的字符串中获取可以解析为int的所有字符?使用LINQ来解析字符串中的数字
例如,我们有这样的字符串:"$%^DDFG 6 7 23 1"
结果必然是"67231"
而且即使是轻微的困难:我们能得到的只有前三个数字?
这会给你字符串
string result = new String("y0urstr1ngW1thNumb3rs".
Where(x => Char.IsDigit(x)).ToArray());
而且第3个字符使用.Take(3)
前ToArray()
我不记得谁先回答这个解决方案。无论如何,我也在这里投票。除了Alan有更多的10k得分。 – Agzam 2010-08-16 13:41:03
以下应该工作。
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
这样的事情呢?
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);
这是一种很难阅读..不是吗? – Agzam 2010-08-16 13:38:16
我想这可能是如果你不知道LINQ和lambda表达式。 – 2010-08-16 20:04:05
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());
正则表达式:
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);
}
public static string DigitsOnly(string strRawData)
{
return Regex.Replace(strRawData, "[^0-9]", "");
}
那个太好了 – Agzam 2010-08-16 13:37:05
> '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 . . .
确切的要求是不完全清楚,就用绳子like'123abc456def'发生什么,你想回到'123456','123'和'456',只是'123'还是'1'和'2'和'3'等? 最好的方法取决于确切的规格。 – 2010-08-13 21:03:24
@保罗说,前三个数字。如何可能更准确?也许你会希望我写出300页的规格书和一些商业计划书和一堆图表? :) – Agzam 2010-08-16 13:35:43