从string中查找并提取一个数字
我有一个要求来查找和提取一个string中包含的数字。
例如,从这些string:
string test = "1 test" string test1 = " 1 test" string test2 = "test 99"
我该怎么做?
\d+
是一个整数的正则expression式。 所以
//System.Text.RegularExpressions.Regex resultString = Regex.Match(subjectString, @"\d+").Value;
返回包含subjectString
第一个数字的subjectString
。
Int32.Parse(resultString)
会给你这个号码。
通过string并使用Char.IsDigit
string a = "str123"; string b = string.Empty; int val; for (int i=0; i< a.Length; i++) { if (Char.IsDigit(a[i])) b += a[i]; } if (b.Length>0) val = int.Parse(b);
以下是我如何清理电话号码以获取数字:
string numericPhone = new String(phone.ToCharArray().Where(c => Char.IsDigit(c)).ToArray());
使用正则expression式…
Regex re = new Regex(@"\d+"); Match m = re.Match("test 66"); if (m.Success) { Console.WriteLine(string.Format("RegEx found " + m.Value + " at position " + m.Index.ToString())); } else { Console.WriteLine("You didn't enter a string containing a number!"); }
我用什么来获取电话号码没有任何标点符号…
var phone = "(787) 763-6511"; string.Join("", phone.ToCharArray().Where(Char.IsDigit)); // result: 7877636511
这是一个Linq
版本:
string s = "123iuow45ss"; var getNumbers = (from t in s where char.IsDigit(t) select t).ToArray(); Console.WriteLine(new string(getNumbers));
Regex.Split可以从string中提取数字。 你得到所有在string中find的数字。
string input = "There are 4 numbers in this string: 40, 30, and 10."; // Split on one or more non-digit characters. string[] numbers = Regex.Split(input, @"\D+"); foreach (string value in numbers) { if (!string.IsNullOrEmpty(value)) { int i = int.Parse(value); Console.WriteLine("Number: {0}", i); } }
输出:
号码:4号码:40号码:30号码:10
只要使用RegEx来匹配string,然后转换:
Match match = Regex.Match(test , @"(\d+)"); if (match.Success) { return int.Parse(match.Groups[1].Value); }
使用正则expression式的另一个简单的解决scheme你应该需要使用这个
using System.Text.RegularExpressions;
和代码是
string var = "Hello3453232wor705Ld"; string mystr = Regex.Replace(var, @"\d", ""); string mynumber = Regex.Replace(var, @"\D", ""); Console.WriteLine(mystr); Console.WriteLine(mynumber);
你也可以试试这个
string.Join(null,System.Text.RegularExpressions.Regex.Split(expr, "[^\\d]"));
这个问题并没有明确说明你只是想要字符0到9,但是从你的示例集和注释中相信这是真的。 所以这里是这样的代码。
string digitsOnly = String.Empty; foreach (char c in s) { // Do not use IsDigit as it will include more than the characters 0 through to 9 if (c >= '0' && c <= '9') digitsOnly += c; }
为什么不想使用Char.IsDigit() – 数字包括诸如分数,下标,上标,罗马数字,货币分子,圈出的数字和特定于脚本的数字等字符。
var match=Regex.Match(@"a99b",@"\d+"); if(match.Success) { int val; if(int.TryParse(match.Value,out val)) { //val is set } }
返回新的string(input.Where(Char.IsDigit).ToArray()); 从string只给出数字。
var outputString = String.Join("", inputString.Where(Char.IsDigit));
获取string中的所有数字。 所以如果你使用examaple'1 plus 2'就会得到'12'。
扩展方法获取string中包含的所有正数:
public static List<long> Numbers(this string str) { var nums = new List<long>(); var start = -1; for (int i = 0; i < str.Length; i++) { if (start < 0 && Char.IsDigit(str[i])) { start = i; } else if (start >= 0 && !Char.IsDigit(str[i])) { nums.Add(long.Parse(str.Substring(start, i - start))); start = -1; } } if (start >= 0) nums.Add(long.Parse(str.Substring(start, str.Length - start))); return nums; }
如果你想要负号,只需修改这个代码来处理减号( -
)
给出这个input:
"I was born in 1989, 27 years ago from now (2016)"
由此产生的号码列表将是:
[1989, 27, 2016]
这是另一种Linq
方法,它从string中提取第一个数字。
string input = "123 foo 456"; int result = 0; bool success = int.TryParse(new string(input .SkipWhile(x => !char.IsDigit(x)) .TakeWhile(x => char.IsDigit(x)) .ToArray()), out result);
例子:
string input = "123 foo 456"; // 123 string input = "foo 456"; // 456 string input = "123 foo"; // 123
对于那些想要在两行中使用正则expression式的string中的十进制数的人:
decimal result = 0; decimal.TryParse(Regex.Match(s, @"\d+").Value, out result);
同样的事情适用于浮动 , 长期等…
做了这个问题的答案之一的相反: 如何使用Regex.Replace从string中删除数字?
// Pull out only the numbers from the string using LINQ var numbersFromString = new String(input.Where(x => x >= '0' && x <= '9').ToArray()); var numericVal = Int32.Parse(numbersFromString);
string verificationCode ="dmdsnjds5344gfgk65585"; string code = ""; Regex r1 = new Regex("\\d+"); Match m1 = r1.Match(verificationCode); while (m1.Success) { code += m1.Value; m1 = m1.NextMatch(); }
这是我的解决scheme
string var = "Hello345wor705Ld"; string alpha = string.Empty; string numer = string.Empty; foreach (char str in var) { if (char.IsDigit(str)) numer += str.ToString(); else alpha += str.ToString(); } Console.WriteLine("String is: " + alpha); Console.WriteLine("Numeric character is: " + numer); Console.Read();
你将不得不使用正则expression式作为\d+
\d
匹配给定string中的数字。
static string GetdigitFromString(string str) { char[] refArray = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; char[] inputArray = str.ToCharArray(); string ext = string.Empty; foreach (char item in inputArray) { if (refArray.Contains(item)) { ext += item.ToString(); } } return ext; }
string s = "kg g L000145.50\r\n"; char theCharacter = '.'; var getNumbers = (from t in s where char.IsDigit(t) || t.Equals(theCharacter) select t).ToArray(); var _str = string.Empty; foreach (var item in getNumbers) { _str += item.ToString(); } double _dou = Convert.ToDouble(_str); MessageBox.Show(_dou.ToString("#,##0.00"));
string input = "Hello 20, I am 30 and he is 40"; var numbers = Regex.Matches(input, @"\d+").OfType<Match>().Select(m => int.Parse(m.Value)).ToArray();
基于最后一个示例,我创build了一个方法:
private string GetNumberFromString(string sLongString, int iLimitNumbers) { string sReturn = "NA"; int iNumbersCounter = 0; int iCharCounter = 0; string sAlphaChars = string.Empty; string sNumbers = string.Empty; foreach (char str in sLongString) { if (char.IsDigit(str)) { sNumbers += str.ToString(); iNumbersCounter++; if (iNumbersCounter == iLimitNumbers) { return sReturn = sNumbers; } } else { sAlphaChars += str.ToString(); iCharCounter++; // reset the counter iNumbersCounter = 0; } } return sReturn; }