文字列から数値を見つけて抽出する


320

文字列に含まれる数値を見つけて抽出する必要があります。

たとえば、次の文字列から:

string test = "1 test"
string test1 = " 1 test"
string test2 = "test 99"

これどうやってするの?


2
数は負になるのでしょうか?もしそうなら、「こんにちは-お元気ですか?-30」はどのように扱われますか?
Jon Skeet、2011年

こんにちはジョン、データに負の数はありません
van

4
小数番号が好き1.5?以下のような指数表現1.5E45
Tim Pietzcker、2011年

同様の(しかし同一ではない):stackoverflow.com/questions/1561273/...
finnw

3
ここで回答が受け入れられないのはなぜですか?
WiktorStribiżew2017

回答:


63

文字列を調べて使用 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);

15
@Thomas:そのコードは機能しませんb == "System.Linq.Enumerable.."。正解です(さらに簡単です)b = String.Join("", a.Where(char.IsDigit))
BlueRaja-Danny Pflughoeft、2015年

1
良い点、それは私がコメントで書いたコードをテストしないことを教えてくれるでしょう!new string(char[])コンストラクタを使用して、char配列から文字列を作成することもできます。
Thomas

1
Regexの方がはるかに優れています。
Jason Kelley

@BlueRaja-Danny Pflughoeft私が投票できるように、コメントを適切な回答にしてみませんか:-)
SteveC

注:文字列に複数の数値が含まれている場合、この回答はそれらをすべて1つの数値にまとめます。たとえば、「a12bcd345」は「12345」になります。(目標に応じて、どちらが望ましいか、または望ましくない場合があります。)これは、上記の場合に「12」を返す、上位投票のRegexソリューションとは異なります。これは、電話番号「555-111-2222」などの場合に重要です。
ToolmakerSteve 2017年

546

\d+整数の正規表現です。そう

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

で最初に出現する数値を含む文字列を返しますsubjectString

Int32.Parse(resultString) それからあなたに番号を与えます。


10
Regex.Match(subjectString, @"-?\d+").Value代わりに使用できる負の数をサポートするには
Jon List

45
この答えは(C#では)完全ではありません。文字列の最初の数値のみを取得しています。一致を反復処理する必要があります:resultString = string.Join(string.Empty、Regex.Matches(subjectString、@ "\ d +")。OfType <Match>()。Select(m => m.Value));
マーカス2014

8
@Markus:質問には「文字列に含まれる数値を抽出する必要がある」とあり、すべての例では、文字列に1つの数値が存在することを示しています。単一のアイテムを反復することは役に立ちません。
Tim Pietzcker 14

2
@ayman:ああ、コンマは何千もの区切り文字ですか?それにはもっと複雑な正規表現が必要になります-これは別の質問で扱われるべきです。優れた出発点は、Regular-Expressions.infoです。これには、.NETの正規表現エンジンに関するセクションも含まれています。
Tim Pietzcker 2014年

5
@DavidSopko:何のことをいっているのですか。元の質問では、タイトルと質問の本文の両方で、文字列から単一の数値を抽出する方法を求めていました。元の著者以外の人によるその後の質問(私の回答の1年後およびそれ以降)の編集により、タイトルが「numbers」に変更されました。どちらかといえば、その誤った編集はロールバックされるべきです。
Tim Pietzcker

181

電話番号をクレンジングして数字のみを取得する方法は次のとおりです。

string numericPhone = new String(phone.Where(Char.IsDigit).ToArray());

31
string numericPhone =new String(phone.Where(Char.IsDigit).ToArray());
Damith 2014

1
非常にエレガントなソリューション.. linqの使用が好き
レオグルディアン

1
整数のための素晴らしい解決策!小数点は数字ではないため、10進数を解析しようとするとこれは機能しないことに注意してください。
Elijah Lofgren

40

正規表現を使用...

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!");
}

33

句読点なしで電話番号を取得するために使用するもの...

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

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

// result: 7877636511

18

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


16

ここにLinqバージョンがあります:

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

14
単純に"123iuow45ss".AsEnumerable().Where(char.IsDigit)どうですか?
イリヤイワノフ

2
from t .. select t冗長性は嫌いだけど、とにかく乾杯。
イリヤイワノフ2013年

14

正規表現を使用した別の簡単な解決策これを使用する必要があります

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

12

これも試すことができます

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

いいですが、元の文字列の数字の間にスペースがある場合、両方の数字が結合された1つの大きな連結文字列が得られます(スペースなし)
Mohammad Zekrallah

11

RegExを使用して文字列を照合し、変換します。

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

9

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

9

2行に正規表現を含む文字列から10進数を取得したい場合:

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

同じことがfloatlongなどにも当てはまります...


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

1
これは、文字列内の複数の数値の配列である、私が欲しいものを私に与えた最良の答えです。数字のコンマ(千の区切り記号)を無視できれば、それで完璧です!:-)
Sagar

9

String以下のようなプロパティを使用してこれを行うことができます:

 return new String(input.Where(Char.IsDigit).ToArray()); 

これは文字列から数だけを与えます。


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

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

Char.IsDigit()を使用したくない理由-数値には、分数、下付き文字、上付き文字、ローマ数字、通貨の数字、丸で囲まれた数字、スクリプト固有の数字などの文字が含まれます。


6
var outputString = String.Join("", inputString.Where(Char.IsDigit));

文字列内のすべての数値を取得します。したがって、例として「1 + 2」を使用すると、「12」になります。


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

負の数も必要な場合は、このコードを変更してマイナス記号(-)を処理します

この入力が与えられた場合:

"I was born in 1989, 27 years ago from now (2016)"

結果の番号リストは次のようになります。

[1989, 27, 2016]

5

数値に小数点がある場合は、以下を使用できます

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


1
この回答をありがとうございました。私はC#とVS2017を使用していて、値をどのように見つけるかを考えていました。お返事ありがとうございます。
バブル


2
  string verificationCode ="dmdsnjds5344gfgk65585";
            string code = "";
            Regex r1 = new Regex("\\d+");
          Match m1 = r1.Match(verificationCode);
           while (m1.Success)
            {
                code += m1.Value;
                m1 = m1.NextMatch();
            }

このコードは、文字列内のすべての整数値を見つけるために使用されます。
Manoj Gupta

コメントとして個別に投稿するよりも、回答に直接いくつかの説明を追加する方が良いでしょう。コメントがすぐに表示されるとは限りません。
John Dvorak

2

ここで興味深いアプローチがAhmad Mageedによって提供されています。Regexと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);

2

これが私のアルゴリズムです

    //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;
    }

1

これが私の解決策です

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


0
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;
    }

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

0

上記の @ tim-pietzcker 回答を使用すると、以下がに対して機能しPowerShellます。

PS C:\> $str = '1 test'
PS C:\> [regex]::match($str,'\d+').value
1

-3

最後のサンプルに基づいて、メソッドを作成しました。

private string GetNumberFromString(string sLongString, int iLimitNumbers)
{
    string sReturn = "NA";
    int iNumbersCounter = 0;
    int iCharCounter = 0; 

    string sAlphaChars = string.Empty;
    string sNumbers = string.Empty;
    foreach (char str in sLongString)
    {
        if (char.IsDigit(str))
        {
            sNumbers += str.ToString();
            iNumbersCounter++;
            if (iNumbersCounter == iLimitNumbers)
            {
                return sReturn = sNumbers;
            }
        }
        else
        {
            sAlphaChars += str.ToString();
            iCharCounter++;
            // reset the counter 
            iNumbersCounter = 0; 
        }
    }
    return sReturn;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.