1

この文字列から数値部分を抽出する最良の方法は何ですか?私はRegularExpressionsを見ましたが、彼らは私を混乱させます。SubStringで可能ですか?

/store/457987680928164?id=2

必要なのは数字だけです。

4

9 に答える 9

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();
        }
    }
}
于 2013-03-01T03:32:45.020 に答える
0

これは正規表現でそれを行います

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

        public static string RemoveNonNumbers(string input)
        {
            return digitsOnly.Replace(input, "");
        }
于 2013-03-01T03:36:50.687 に答える
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
于 2013-03-01T03:37:27.780 に答える
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;
}
于 2013-03-01T03:28:53.503 に答える
0

これには正規表現を使用することを強くお勧めします。文字列パターンのマッチングと抽出は、正規表現にとって本当に理想的なシナリオです。

提供した文字列サンプルに一致する正規表現を次に示します。文字列の数値部分の括弧をキャプチャします。

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

ここで正規表現テスターで確認できます。サンプルの文字列と上記で作成した正規表現を使用してテストしました。

于 2013-03-01T03:32:49.710 に答える
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
}
于 2013-03-01T03:34:34.637 に答える
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("?");
于 2013-03-01T03:39:33.430 に答える
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
于 2013-03-01T03:39:51.397 に答える
0
 string str = "/store/457987680928164?id=2";
 string num = new string(str.Remove(str.IndexOf("?")).Where(a => char.IsDigit(a)).ToArray());
于 2013-03-01T03:50:31.323 に答える