c# - шаблоном - регулярные выражения найти числа в строке




Найти и извлечь номер из строки (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

У меня есть требование найти и извлечь число, содержащееся в строке.

Например, из этих строк:

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

Как я могу это сделать?



Вам нужно будет использовать Regex как \d+

\d соответствует цифрам в данной строке.


Вот версия Linq :

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

Вот как я чищу номера телефонов, чтобы получить только цифры:

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

Вот мой алгоритм

    //compatible C# and JAVA
    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;
    }

Вы также можете попробовать это

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

Для тех, кто хочет десятичное число из строки с регулярным выражением в TWO строке:

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

То же самое относится к float , long и т. Д. ...


Интересный подход here дает Ахмад Магед, использует Regex и stringbuilder для извлечения целых чисел в том порядке, в котором они появляются в строке.

Пример использования 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);

Метод расширения для получения всех положительных чисел, содержащихся в строке:

    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]

Просто используйте RegEx для соответствия строке, а затем конвертируйте:

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

То, что я использую, чтобы получить номера телефонов без знаков препинания ...

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

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

// result: 7877636511

использовать регулярное выражение ...

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

пройдите через строку и используйте 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);

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

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

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

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




string