문자열에서 숫자 찾기 및 추출


319

문자열에 포함 된 숫자를 찾아 추출해야합니다.

예를 들어 다음 문자열에서

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

어떻게해야합니까?


2
숫자가 음수 일 수 있습니까? 그렇다면 "Hello-잘 지내시나요? -30"은 어떻게 처리됩니까?
Jon Skeet

안녕 존, 데이터에 음수가 없음
van

4
10 진수는 1.5? 1.5E45? 와 같은 지수 표기법
Tim Pietzcker

유사하지만 동일하지 않음 : stackoverflow.com/questions/1561273/…
finnw

3
여기에 답변이없는 이유는 무엇입니까?
Wiktor Stribiżew

답변:


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
@ 토마스 : 그 코드는 작동하지 않습니다 b == "System.Linq.Enumerable..". 것이 올바른 (그리고 더 간단)b = String.Join("", a.Where(char.IsDigit))
BlueRaja - 대니 Pflughoeft

1
좋은 지적, 그것은 내가 주석으로 작성한 코드를 테스트하지 않도록 가르쳐 줄 것입니다! new string(char[])생성자를 사용하여 char 배열에서 문자열을 만들 수도 있습니다 .
토마스

1
정규식은 훨씬 더 잘 작동합니다.
Jason Kelley

@BlueRaja-Danny Pflughoeft 의견을 적절하게 작성하여 투표를
해주십시오.

참고 : 문자열에 여러 개의 숫자가 포함 된 경우이 답변은 하나의 숫자로 모두 함께 실행됩니다. 예를 들어 "a12bcd345"는 "12345"가됩니다. (목표에 따라 어느 것이 바람직 할 수도 있고 그렇지 않을 수도 있습니다.) 이것은 위의 경우 "12"를 반환하는 최상위 투표 Regex 솔루션과 다릅니다. 전화 번호 "555-111-2222"와 같은 경우에 해당합니다.
ToolmakerSteve

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

8
@Markus : 질문에 " 문자열에 포함 숫자 를 추출해야합니다"라고 표시되어 있으며 모든 예제는 문자열에 단일 숫자가 있음을 보여줍니다. 단일 항목을 반복하는 것은 유용하지 않습니다.
Tim Pietzcker

2
@ayman : 오, 쉼표는 천 단위 구분 기호입니까? 그것은 훨씬 더 복잡한 정규 표현식을 필요로 할 것입니다-별도의 질문으로 처리해야합니다. 훌륭한 시작점은 Regular-Expressions.info 이며 .NET의 정규식 엔진에 대한 섹션도 포함되어 있습니다.
Tim Pietzcker

5
@DavidSopko : 무슨 소리 야? 원래 질문은 제목과 질문 본문 모두에서 문자열에서 단일 숫자를 추출하는 방법을 요구했습니다. 원저자가 아닌 사람들이 질문에 대한 후속 편집 (1 년 후 답변)을 제목을 "숫자"로 변경했습니다. 문제가있는 경우 잘못된 편집을 롤백해야합니다.
Tim Pietzcker 2016 년

180

전화 번호를 정리하여 숫자 만 얻는 방법은 다음과 같습니다.

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

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

1
매우 우아한 솔루션 .. 나는 linq의 사용을 좋아합니다
Leo Gurdian

1
정수에 대한 좋은 해결책! 소수점이 숫자가 아니기 때문에 십진수를 구문 분석하려는 경우에는 작동하지 않습니다.
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)?
Ilya Ivanov

2
난 그냥 from t .. select t중복을 좋아하지 않지만 어쨌든 건배.
Ilya Ivanov

14

Regex를 사용하는 또 다른 간단한 솔루션 이것을 사용해야합니다.

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

줄에 Regex 가 있는 문자열에서 십진수 를 원하는 사람들의 경우 :

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

같은 일이 시만의 정보는 다음의 제품에 , , 등 ...


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 2016 년

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 plus 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

"anything 876 anything"==> 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

흥미로운 접근 방식이 제공됩니다 여기 아마드 Mageed에 의해, 그들은 문자열에 나타나는 순서대로 정수를 추출하는 정규식과의 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

정규식을 다음과 같이 사용해야합니다. \d+

\d 주어진 문자열의 숫자와 일치합니다.


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


-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.