【问题标题】: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这样的指数符号?
  • 类似(但不相同):stackoverflow.com/questions/1561273/…
  • 为什么这里不接受答案?

标签: c# .net regex string


【解决方案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().Select(m => m.Value));
  • @Markus:问题说明“我需要提取字符串中包含的 a 数字”,所有示例都显示一个数字存在于字符串中。迭代单个项目没有用。
  • @ayman:哦,逗号是千位分隔符吗?这将需要一个更复杂的正则表达式——这应该在一个单独的问题中处理。 Regular-Expressions.info 是一个很好的起点,其中还包含有关 .NET 正则表达式引擎的部分。
  • @DavidSopko:你在说什么?最初的问题要求在标题和问题正文中从字符串中提取单个数字的方法。原始作者以外的其他人对该问题的后续编辑(在我回答后一年及之后)将标题更改为“数字”。如果有的话,应该回滚那个错误的编辑。
【解决方案2】:

以下是我清理电话号码以仅获取数字的方法:

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

            同样适用于 floatlong 等...

            【讨论】:

              【解决方案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();
                                          }
                                      

                                      注意:以上示例函数仅适用于正数

                                      【讨论】:

                                        猜你喜欢
                                        • 2021-01-13
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 2017-02-25
                                        • 2023-03-19
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        相关资源
                                        最近更新 更多