从字符串中查找并提取数字
Posted
技术标签:
【中文标题】从字符串中查找并提取数字【英文标题】:Find and extract a number from a string 【发布时间】:2011-01-19 10:24:53 【问题描述】:我需要查找并提取字符串中包含的数字。
例如,从这些字符串中:
string test = "1 test"
string test1 = " 1 test"
string test2 = "test 99"
我该怎么做?
【问题讨论】:
这个数字可能是负数吗?如果是这样,“你好-你好吗?-30”如何处理? 嗨约翰,数据中没有负数 像1.5
这样的小数?像1.5E45
这样的指数符号?
类似(但不相同):***.com/questions/1561273/…
为什么这里不接受答案?
【参考方案1】:
\d+
是整数的正则表达式。所以
//System.Text.RegularExpressions.Regex
resultString = Regex.Match(subjectString, @"\d+").Value;
返回一个字符串,其中包含 subjectString
中第一次出现的数字。
Int32.Parse(resultString)
然后会给你号码。
【讨论】:
要支持负数,您可以改用Regex.Match(subjectString, @"-?\d+").Value
这个答案不完整(在 C# 中)。它只获取字符串中的第一个数字。您必须对匹配项进行迭代: resultString = string.Join(string.Empty, Regex.Matches(subjectString, @"\d+").OfType以下是我清理电话号码以仅获取数字的方法:
string numericPhone = new String(phone.Where(Char.IsDigit).ToArray());
【讨论】:
string numericPhone =new String(phone.Where(Char.IsDigit).ToArray());
非常优雅的解决方案.. 我喜欢使用 linq
整数的好解决方案!请注意,如果您尝试解析十进制数,这将不起作用,因为小数点不是数字。【参考方案3】:
遍历字符串并使用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);
【讨论】:
@Thomas:该代码不起作用,结果为b == "System.Linq.Enumerable.."
。正确(甚至更简单)是b = String.Join("", a.Where(char.IsDigit))
好点,这会教我不要测试我在评论中写的代码!您还可以使用 new string(char[])
构造函数从 char 数组中创建一个字符串。
Regex 做得更好。
@BlueRaja - Danny Pflughoeft 为什么不让你的评论成为正确的答案,这样我就可以投票了:-)
注意:如果字符串包含多个数字,此答案会将它们一起运行成一个数字。例如。 “a12bcd345”的结果是“12345”。 (这可能是可取的,也可能不是,取决于目标。)这与投票率最高的 Regex 解决方案不同,后者在上述情况下将返回“12”。这对于电话号码“555-111-2222”等情况很重要。【参考方案4】:
使用正则表达式 ...
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!");
【讨论】:
【参考方案5】:我用来获取没有任何标点符号的电话号码...
var phone = "(787) 763-6511";
string.Join("", phone.ToCharArray().Where(Char.IsDigit));
// result: 7877636511
【讨论】:
【参考方案6】:Regex.Split 可以从字符串中提取数字。您将获得在字符串中找到的所有数字。
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
【讨论】:
前缀零值未提取。例如 0001234。运单:1234【参考方案7】:这是Linq
版本:
string s = "123iuow45ss";
var getNumbers = (from t in s
where char.IsDigit(t)
select t).ToArray();
Console.WriteLine(new string(getNumbers));
【讨论】:
简单的"123iuow45ss".AsEnumerable().Where(char.IsDigit)
怎么样?
我只是不喜欢 from t .. select t
冗余,但无论如何,干杯。【参考方案8】:
另一个使用正则表达式的简单解决方案 你应该需要使用这个
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);
【讨论】:
这不是问题要问的,但正是我要找的!谢谢!【参考方案9】:你也可以试试这个
string.Join(null,System.Text.RegularExpressions.Regex.Split(expr, "[^\\d]"));
【讨论】:
很好,但是如果原始字符串中的数字之间有空格,那么它将为您提供 1 个大的串联字符串,其中两个数字都连接在一起(没有空格)【参考方案10】:如果数字有小数点,可以在下面使用
using System;
using System.Text.RegularExpressions;
namespace Rextester
public class Program
public static void Main(string[] args)
//Your code goes here
Console.WriteLine(Regex.Match("anything 876.8 anything", @"\d+\.*\d*").Value);
Console.WriteLine(Regex.Match("anything 876 anything", @"\d+\.*\d*").Value);
Console.WriteLine(Regex.Match("$876435", @"\d+\.*\d*").Value);
Console.WriteLine(Regex.Match("$876.435", @"\d+\.*\d*").Value);
结果:
“任何东西 876.8 任何东西” ==> 876.8
“任何东西 876 任何东西” ==> 876
"$876435" ==> 876435
"$876.435" ==> 876.435
示例:https://dotnetfiddle.net/IrtqVt
【讨论】:
非常感谢您的回答。我正在使用 C# 和 VS2017,并试图弄清楚如何找到价值。再次感谢您的回答。【参考方案11】:只需使用正则表达式匹配字符串,然后转换:
Match match = Regex.Match(test , @"(\d+)");
if (match.Success)
return int.Parse(match.Groups[1].Value);
【讨论】:
【参考方案12】:这是另一种Linq
方法,它从字符串中提取第一个数字。
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
【讨论】:
【参考方案13】: 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();
【讨论】:
这是最好的答案,它给了我想要的东西,它是字符串中多个数字的数组。如果它可以忽略数字中的逗号(千位分隔符),那将是完美的! :-)【参考方案14】:您可以使用String
属性来执行此操作,如下所示:
return new String(input.Where(Char.IsDigit).ToArray());
只给出字符串中的数字。
【讨论】:
【参考方案15】:对于那些想要在 TWO 行中使用 Regex 的字符串中的 十进制 数字:
decimal result = 0;
decimal.TryParse(Regex.Match(s, @"\d+").Value, out result);
同样适用于 float、long 等...
【讨论】:
【参考方案16】:var match=Regex.Match(@"a99b",@"\d+");
if(match.Success)
int val;
if(int.TryParse(match.Value,out val))
//val is set
【讨论】:
【参考方案17】:该问题并未明确说明您只想要字符 0 到 9,但从您的示例集和 cmets 中相信这是正确的并不是一件容易的事。所以这是执行此操作的代码。
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() - 数字包括分数、下标、上标、罗马数字、货币分子、带圆圈的数字和特定于脚本的数字等字符。
【讨论】:
【参考方案18】:var outputString = String.Join("", inputString.Where(Char.IsDigit));
获取字符串中的所有数字。 因此,如果您使用例如“1 加 2”,它将得到“12”。
【讨论】:
【参考方案19】:获取字符串中包含的所有正数数的扩展方法:
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;
如果您还想要负数,只需修改此代码以处理减号 (-
)
鉴于此输入:
"I was born in 1989, 27 years ago from now (2016)"
生成的数字列表将是:
[1989, 27, 2016]
【讨论】:
【参考方案20】:Ahmad Mageed 提供了一个有趣的方法here,它使用正则表达式和StringBuilder
按整数在字符串中出现的顺序提取整数。
根据 Ahmad Mageed 的帖子使用Regex.Split
的示例如下:
var dateText = "MARCH-14-Tue";
string splitPattern = @"[^\d]";
string[] result = Regex.Split(dateText, splitPattern);
var finalresult = string.Join("", result.Where(e => !String.IsNullOrEmpty(e)));
int DayDateInt = 0;
int.TryParse(finalresult, out DayDateInt);
【讨论】:
【参考方案21】: string verificationCode ="dmdsnjds5344gfgk65585";
string code = "";
Regex r1 = new Regex("\\d+");
Match m1 = r1.Match(verificationCode);
while (m1.Success)
code += m1.Value;
m1 = m1.NextMatch();
【讨论】:
此代码用于查找字符串中的所有整数值。 最好直接在答案中添加一些描述,而不是作为评论单独发布。评论并不总是立即可见。【参考方案22】:对这个问题的答案之一做相反的事情: How to remove numbers from string using Regex.Replace?
// 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);
【讨论】:
【参考方案23】:我已经使用这个单行从任何字符串中提取所有数字。
var phoneNumber = "(555)123-4567";
var numsOnly = string.Join("", new Regex("[0-9]").Matches(phoneNumber)); // 5551234567
【讨论】:
【参考方案24】:这是我的算法
//Fast, C Language friendly
public static int GetNumber(string Text)
int val = 0;
for(int i = 0; i < Text.Length; i++)
char c = Text[i];
if (c >= '0' && c <= '9')
val *= 10;
//(ASCII code reference)
val += c - 48;
return val;
【讨论】:
【参考方案25】: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;
【讨论】:
尝试了其他方法,如正则表达式等。但这是最容易理解的!【参考方案26】:这是我的解决方案
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();
【讨论】:
【参考方案27】:您必须将正则表达式用作\d+
\d
匹配给定字符串中的数字。
【讨论】:
【参考方案28】: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"));
【讨论】:
【参考方案29】:使用@tim-pietzcker answer from above,以下将适用于PowerShell
。
PS C:\> $str = '1 test'
PS C:\> [regex]::match($str,'\d+').value
1
【讨论】:
【参考方案30】:使用 StringBuilder 比循环中的字符串连接性能略高。如果您正在处理大字符串,它的性能要高得多。
public static string getOnlyNumbers(string input)
StringBuilder stringBuilder = new StringBuilder(input.Length);
for (int i = 0; i < input.Length; i++)
if (input[i] >= '0' && input[i] <= '9')
stringBuilder.Append(input[i]);
return stringBuilder.ToString();
注意:以上示例函数仅适用于正数
【讨论】:
以上是关于从字符串中查找并提取数字的主要内容,如果未能解决你的问题,请参考以下文章