从字符串之间提取数字

时间:2013-03-01 03:25:41

标签: c# regex

从这个字符串中提取数字部分的最佳方法是什么?我看了一下RegularExpressions,但是他们让我感到困惑。是否可以使用SubString?

/store/457987680928164?id=2

我需要的只是数字。

9 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

您应该获得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 :(得分:0)

我肯定会建议使用RegEx。字符串模式匹配和提取实际上是正则表达式的理想方案。

这是一个RegEx,它将匹配您提供的字符串示例,并捕获字符串数字部分的括号:

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

您可以在Regex Tester中进行验证。我使用你的示例字符串和我在上面写的RegEx测试了它。

答案 3 :(得分:0)

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

更快
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 :(得分:0)

使用正则表达式

private static Regex digitsOnly = new Regex(@"[^\d]");

        public static string RemoveNonNumbers(string input)
        {
            return digitsOnly.Replace(input, "");
        }

答案 5 :(得分:0)

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

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 :(得分:0)

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

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("?");

答案 7 :(得分:0)

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

答案 8 :(得分:0)

 string str = "/store/457987680928164?id=2";
 string num = new string(str.Remove(str.IndexOf("?")).Where(a => char.IsDigit(a)).ToArray());