从字符串中查找并提取数字

452

我需要找到并提取字符串中包含的数字。

例如,从以下字符串中:

string test = "1 test"
string test1 = " 1 test"
string test2 = "test 99"

我该怎么做?


3
这个数字可能是负数吗?如果是,那么“Hello - how are you? -30”会如何处理? - Jon Skeet
嗨约翰,数据中没有负数。 - van
8
十进制数,如1.5?指数记数法,如1.5E45 - Tim Pietzcker
https://dev59.com/snRA5IYBdhLWcg3wvgkb#844479 - mcfea
3
为什么这里没有接受答案的选项? - Wiktor Stribiżew
显示剩余2条评论
32个回答

734

\d+ 是匹配整数的正则表达式。

//System.Text.RegularExpressions.Regex
resultString = Regex.Match(subjectString, @"\d+").Value;

返回一个字符串,其中包含subjectString中的第一次出现的数字。

然后使用Int32.Parse(resultString)将给您这个数字。


13
要支持负数,你可以使用Regex.Match(subjectString, @"-?\d+").Value - Jon List
69
这个答案(用C#语言)并不完整,它只获取了字符串中的第一个数字。你需要遍历所有匹配项:resultString = string.Join(string.Empty, Regex.Matches(subjectString, @"\d+").OfType<Match>().Select(m => m.Value)); - Markus
13
问题指出“我需要从字符串中提取一个数字”,并且所有示例都显示字符串中只有一个数字。遍历单个项目没有用。 - Tim Pietzcker
3
问题是从字符串中提取一个整数,而不是解析电话号码(StackOverflow 上关于该主题的问题已足够多)... - Tim Pietzcker
7
@DavidSopko: 你在说什么?原问题要求从字符串中提取单个数字,标题和问题正文都是这样。后来有其他人对问题进行了编辑(一年后),将标题改为“数字”。如果有什么问题的话,应该撤销那次错误的编辑。 - Tim Pietzcker
显示剩余11条评论

282

以下是我如何清洗电话号码,仅保留数字:

string numericPhone = new String(phone.Where(Char.IsDigit).ToArray());

38
string numericPhone =new String(phone.Where(Char.IsDigit).ToArray()); - Damith
3
非常优雅的解决方案。我喜欢使用LINQ。 - Leo Gurdian
3
整数的好解决方案!请注意,如果您尝试解析小数,这将不起作用,因为小数点不是数字。 - Elijah Lofgren
如果您喜欢,也可以使用 Concat 替换字符串构造:string.Concat(phone.Where(Char.IsDigit).ToArray()) - zcoop98

104

遍历字符串并使用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);

27
@Thomas说这段代码无法工作,它的结果是b == "System.Linq.Enumerable.."。正确的(甚至更简单的)写法应该是 b = String.Join("", a.Where(char.IsDigit)) - BlueRaja - Danny Pflughoeft
2
好的观点,这会教会我不要在注释中编写代码!您还可以使用new string(char[])构造函数从char数组创建一个字符串。 - Thomas
1
正则表达式做得更好。 - Jason Kelley
@BlueRaja - Danny Pflughoeft 为什么不把你的评论变成一个正式的答案,这样我就可以投票支持它了 :-) - SteveC
2
注意:如果字符串包含多个数字,则此答案将它们全部合并为一个数字。例如,“a12bcd345”会得到“12345”。这可能是有意或不必要的,具体取决于目标。这与得票最高的正则表达式解决方案不同,后者将返回上述情况的“12”。这对于电话号码“555-111-2222”等情况很重要。 - ToolmakerSteve
这是一种非常繁琐和低级的方式,不建议使用,当您可以使用内置的正则表达式支持时。 - Gregor

47

使用正则表达式...

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!");
}

41

我用的方法可以获取没有任何标点符号的电话号码...

var phone = "(787) 763-6511";

string.Join("", phone.ToCharArray().Where(Char.IsDigit));

// result: 7877636511

29

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。 - Raj Kumar

20

如果这个数有小数点,可以使用以下方法:

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);
        }
    }
}

结果:

"anything 876.8 anything" ==> 876.8

"anything 876 anything" ==> 876

"$876435" ==> 876435

"$876.435" ==> 876.435

示例: https://dotnetfiddle.net/IrtqVt


1
非常感谢您的回答。我正在使用C#和VS2017,一直在尝试找到如何查找该值。再次感谢您的回答。 - Bubbles
1
FYI,这也可以提取多个值,是完美的解决方案。 - WtFudgE

17
这里有一个基于 Linq 的版本:
string s = "123iuow45ss";
var getNumbers = (from t in s
                  where char.IsDigit(t)
                  select t).ToArray();
Console.WriteLine(new string(getNumbers));

16
怎么样只用 "123iuow45ss".AsEnumerable().Where(char.IsDigit) 就可以了? - Ilya Ivanov
2
我只是不喜欢 from t .. select t 的冗余,但无论如何,干杯。 - Ilya Ivanov

16

使用正则表达式的另一个简单解决方案 你应该需要使用这个

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);

这并不完全是问题所问的,但却正是我在寻找的!非常感谢! - Brendan Getz

13

你也可以尝试这个方法

string.Join(null,System.Text.RegularExpressions.Regex.Split(expr, "[^\\d]"));

1
如果原始字符串中数字之间有空格,则会生成一个大的连接字符串,其中包含两个数字(没有空格)。不错,但需要注意。 - Mohammad Zekrallah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接