【问题标题】:Extracting Numbers From Between String [duplicate]从字符串之间提取数字[重复]
【发布时间】:2013-03-01 11:50:31
【问题描述】:

从这个字符串中提取数字部分的最佳方法是什么?我查看了正则表达式,但它们把我搞糊涂了。 SubString 可以吗?

/store/457987680928164?id=2

我只需要数字。

【问题讨论】:

  • 只有第一个(大)数字,而不是第二个?字符串的路径段是否可以超过您上面显示的两个路径段?
  • 要提取 457987680928164 还是 579876809281642 ?
  • 我需要的数量很大。而且没有字符串只有 1 个路径段。

标签: c# regex


【解决方案1】:

RegEx 是解决此问题的好方法,但如果您打算使用 SubString...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string test = "/store/457987680928164?id=2";
            int start = test.IndexOfAny("0123456789".ToCharArray());
            int end = test.IndexOf("?");

            Console.WriteLine(test.Substring(start, end - start));

            Console.ReadLine();
        }
    }
}

【讨论】:

  • 非常适合我的要求。
【解决方案2】:

您应该获得 RadExpression Designer 并使用备忘单自学 RegEx。

如果 RegEx 让您感到害怕,只需循环执行,这通常会更快:

string s = "/store/457987680928164?id=2";
string numericInput = string.Empty;
foreach(char c in s)
{
   if (char.IsDigit(c))
       numericInput  += c;
}

【讨论】:

  • 这将拾取所有数字,因此在本例中它会被最后一个“2”尾随
【解决方案3】:

我更喜欢正则表达式,这不是在我的示例中使用子字符串的运行速度比它快

static long GrabFirstLongFromString(string input)
{
    string intAsString = String.Empty;
    bool startedInt = false;
    foreach(char c in input)
    {
        if (Char.IsDigit(c))
        {
            startedInt = true; //really only care about the first digit
            intAsString += c;
        }
        else if (startedInt)
            return long.Parse(intAsString);
    }
    return -1; //define a default, since this only does a 0 or positive I picked a negative
}

【讨论】:

    【解决方案4】:

    这是用正则表达式实现的

    private static Regex digitsOnly = new Regex(@"[^\d]");
    
            public static string RemoveNonNumbers(string input)
            {
                return digitsOnly.Replace(input, "");
            }
    

    【讨论】:

      【解决方案5】:

      或者只是简单的正则表达式:

      Regex r = new Regex(@"\d+");
      MatchCollection m = r.Matches("/store/457987680928164?id=2");
      
      if (m.Count > 0)
      {
          Console.WriteLine(string.Format("Big number: {0} - Little number: {1}", m[0], m[1]));
      }
      

      以上打印:

      Big number: 457987680928164 - Little number: 2
      

      【讨论】:

        【解决方案6】:

        我肯定会推荐为此使用 RegEx。字符串模式匹配和提取确实是正则表达式的理想场景。

        这是一个正则表达式,它将匹配您提供的字符串示例,并为字符串的数字部分捕获括号:

        ^/store/(\d+)\?id=(\d+)
        

        您可以在Regex Tester 中验证它。我使用您的示例字符串和我上面写的正则表达式对其进行了测试。

        【讨论】:

          【解决方案7】:

          我想出了这些扩展方法来简化常见的字符串解析任务:

          private static string Substring(string str, string value, bool isLastValue, bool isAfterValue, StringComparison comparisonType, string defaultValue)
          {
              int pos = isLastValue ? str.LastIndexOf(value, comparisonType) : str.IndexOf(value, comparisonType);
              if (pos == -1) return defaultValue;
              return isAfterValue ? str.Substring(pos + value.Length) : str.Substring(0, pos);
          }
          
          public static string SubstringBeforeFirst(this string str, string value, StringComparison comparisonType = StringComparison.CurrentCulture, string defaultValue = "")
          {
              return Substring(str, value, false, false, comparisonType, defaultValue);
          }
          
          public static string SubstringBeforeLast(this string str, string value, StringComparison comparisonType = StringComparison.CurrentCulture, string defaultValue = "")
          {
              return Substring(str, value, true, false, comparisonType, defaultValue);
          }
          
          public static string SubstringAfterFirst(this string str, string value, StringComparison comparisonType = StringComparison.CurrentCulture, string defaultValue = "")
          {
              return Substring(str, value, false, true, comparisonType, defaultValue);
          }
          
          public static string SubstringAfterLast(this string str, string value, StringComparison comparisonType = StringComparison.CurrentCulture, string defaultValue = "")
          {
              return Substring(str, value, true, true, comparisonType, defaultValue);
          }
          

          至于从您的示例中获取数字:

          string s = "/store/457987680928164?id=2";
          string number = s.SubstringAfterLast("/").SubstringBeforeFirst("?");
          

          【讨论】:

            【解决方案8】:

            YARS(又一个正则表达式解决方案)

            以下内容:

            var str = "/store/457987680928164?id=2";
            
            var regex = new Regex(@"\d+");
            foreach (Match match in regex.Matches(str))
            {
                Console.WriteLine(match.Value);
            }
            

            输出这个:

            457987680928164
            2
            

            【讨论】:

              【解决方案9】:
               string str = "/store/457987680928164?id=2";
               string num = new string(str.Remove(str.IndexOf("?")).Where(a => char.IsDigit(a)).ToArray());
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-10-13
                • 1970-01-01
                • 2018-12-14
                • 2022-11-02
                • 2017-02-17
                • 2016-12-09
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多