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

van*_*van 294 .net c# regex string

我需要查找并提取字符串中包含的数字.

例如,从这些字符串:

string test = "1 test"
string test1 = " 1 test"
string test2 = "test 99"
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Tim*_*ker 512

\d+是整数的正则表达式.所以

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

返回包含第一次出现的数字的字符串subjectString.

Int32.Parse(resultString) 然后会给你这个号码.

  • 这个答案不完整(在C#中).它只获取字符串中的第一个数字.你必须在匹配上进行itarate:resultString = string.Join(string.Empty,Regex.Matches(subjectString,@"\ d +").OfType <Match>().Select(m => m.Value)); (40认同)
  • 为了支持负数你可以使用`Regex.Match(subjectString,@" - ?\ d +").改为.值` (10认同)
  • @Markus:问题是"我需要提取***包含在字符串中的***号码",并且所有示例都显示字符串中存在单个数字.迭代单个项目是没有用的. (7认同)
  • @DavidSopko:你在说什么?原始问题要求在标题和问题正文中从字符串中提取单个数字的方法.由原作者以外的人对问题进行后续编辑(我的答案后一年及之后)将标题更改为"数字".如果有的话,应该回滚那个错误的编辑. (5认同)
  • @ayman:哦,逗号是千位分隔符?这将需要一个更复杂的正则表达式 - 应该在一个单独的问题中处理.一个很好的起点是[Regular-Expressions.info](http://www.regular-expressions.info/),其中还包含有关.NET正则表达式引擎的部分. (2认同)
  • @DavidSopko:问题是关于从字符串中提取单个整数,而不是关于解析电话号码(在 StackOverflow 上有足够多的关于该主题的问题)...... (2认同)
  • @DavidSopko:“我需要查找并提取字符串中包含的*一个数字*”... (2认同)

Dav*_*ave 162

以下是我如何清理电话号码以获取数字:

string numericPhone = new String(phone.Where(Char.IsDigit).ToArray());
Run Code Online (Sandbox Code Playgroud)

  • `string numericPhone = new String(phone.Where(Char.IsDigit).ToArray());` (29认同)
  • 整数的好解决方案!请注意,如果您尝试解析十进制数,这将不起作用,因为小数点不是数字。 (3认同)
  • 非常优雅的解决方案..我喜欢使用 linq (2认同)

Sas*_*nyi 53

通过字符串并使用 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);
Run Code Online (Sandbox Code Playgroud)

  • @Thomas:该代码不起作用,结果是`b =="System.Linq.Enumerable .."`.正确(甚至更简单)将是`b = String.Join("",a.Where(char.IsDigit))` (12认同)
  • 好点,这会教我不要测试我在评论中编写的代码!您还可以使用 new string(char[]) 构造函数从 char 数组创建字符串。 (2认同)
  • 注意:如果字符串包含多个数字,则此答案会将它们全部合并为一个数字。例如,“a12bcd345”结果为“12345”。(这可能是可取的,也可能不是,这取决于目标。)这与投票最高的 Regex 解决方案不同,后者将在上述情况下返回“12”。这对于电话号码“555-111-2222”等情况很重要。 (2认同)

Pra*_*ana 38

使用正则表达式...

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!");
}
Run Code Online (Sandbox Code Playgroud)


ejc*_*tes 32

我用什么来获取没有任何标点符号的电话号码...

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

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

// result: 7877636511
Run Code Online (Sandbox Code Playgroud)


Tab*_*res 17

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

编号:4编号:40编号:30编号:10


spa*_*jce 15

这是一个Linq版本:

string s = "123iuow45ss";
var getNumbers = (from t in s
                  where char.IsDigit(t)
                  select t).ToArray();
Console.WriteLine(new string(getNumbers));
Run Code Online (Sandbox Code Playgroud)

  • 简单地说"123iuow45ss".AsEnumerable().Where(char.IsDigit)`? (14认同)
  • 我只是不喜欢`从t ...选择t`冗余,但无论如何,欢呼. (2认同)

Blo*_*mer 13

这是另一个简单的解决方案,Linq它仅从字符串中提取数值。

var numbers = string.Concat(stringInput.Where(char.IsNumber));
Run Code Online (Sandbox Code Playgroud)

例子:

var numbers = string.Concat("(787) 763-6511".Where(char.IsNumber));
Run Code Online (Sandbox Code Playgroud)

给出:“7877636511”


Bvd*_*Ven 12

你也可以试试这个

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


小智 12

使用Regex的另一个简单解决方案您应该使用它

using System.Text.RegularExpressions;
Run Code Online (Sandbox Code Playgroud)

而代码是

string var = "Hello3453232wor705Ld";
string mystr = Regex.Replace(var, @"\d", "");
string mynumber = Regex.Replace(var, @"\D", "");
Console.WriteLine(mystr);
Console.WriteLine(mynumber);
Run Code Online (Sandbox Code Playgroud)


Dan*_*ger 11

只需使用RegEx匹配字符串,然后转换:

Match match = Regex.Match(test , @"(\d+)");
if (match.Success) {
   return int.Parse(match.Groups[1].Value);
}
Run Code Online (Sandbox Code Playgroud)


Tar*_*lah 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果 :

“任何东西 876.8 任何东西”==> 876.8

“任何东西 876 任何东西”==> 876

“$876435”==> 876435

“$876.435”==> 876.435

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


Ric*_* Fu 9

对于那些想要在行中使用Regex的字符串中的十进制数的人:

decimal result = 0;
decimal.TryParse(Regex.Match(s, @"\d+").Value, out result);
Run Code Online (Sandbox Code Playgroud)

同样的事情适用于浮动,长期等...


fub*_*ubo 8

这是另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);
Run Code Online (Sandbox Code Playgroud)

例子:

string input = "123 foo 456"; // 123
string input = "foo 456";     // 456
string input = "123 foo";     // 123
Run Code Online (Sandbox Code Playgroud)


Shy*_*hah 8

您可以使用String以下属性执行此操作:

 return new String(input.Where(Char.IsDigit).ToArray()); 
Run Code Online (Sandbox Code Playgroud)

它只提供字符串中的数字.


spe*_*der 7

var match=Regex.Match(@"a99b",@"\d+");
if(match.Success)
{
    int val;
    if(int.TryParse(match.Value,out val))
    {
        //val is set
    }
}
Run Code Online (Sandbox Code Playgroud)


Att*_*ers 7

这个问题没有明确说明你只想要字符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;
        }
Run Code Online (Sandbox Code Playgroud)

为什么你不想使用Char.IsDigit() - 数字包括分数,下标,上标,罗马数字,货币分子,环绕数字和脚本特定数字等字符.


小智 7

 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();
Run Code Online (Sandbox Code Playgroud)


Tom*_*Tom 6

var outputString = String.Join("", inputString.Where(Char.IsDigit));
Run Code Online (Sandbox Code Playgroud)

获取字符串中的所有数字.因此,如果您使用examaple'1 plus 2',它将获得'12'.


Tho*_*ena 5

扩展方法来获取字符串中包含的所有数:

    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;
    }
Run Code Online (Sandbox Code Playgroud)

如果还需要负数,只需修改此代码即可处理减号(-

鉴于此输入:

"I was born in 1989, 27 years ago from now (2016)"
Run Code Online (Sandbox Code Playgroud)

结果数字列表将是:

[1989, 27, 2016]
Run Code Online (Sandbox Code Playgroud)


Sim*_*mba 5

Ahmad Mageed在这里提供了一种有趣的方法,使用正则表达式并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);
Run Code Online (Sandbox Code Playgroud)


Ree*_*eed 5

我已经使用这一行从任何字符串中提取所有数字。

var phoneNumber = "(555)123-4567";
var numsOnly = string.Join("", new Regex("[0-9]").Matches(phoneNumber)); // 5551234567
Run Code Online (Sandbox Code Playgroud)