Как найти определенное число в строке

Suppose I have a string like – “you can enter maximum 500 choices”.
I need to extract 500 from the string.

The main problem is the String may vary like “you can enter maximum 12500 choices”.
So how to get the integer part?

brasofilo's user avatar

brasofilo

25.3k15 gold badges91 silver badges178 bronze badges

asked Oct 26, 2009 at 5:26

Devi's user avatar

1

Use a regular expression.

var r = /d+/;
var s = "you can enter maximum 500 choices";
alert (s.match(r));

The expression d+ means “one or more digits”. Regular expressions by default are greedy meaning they’ll grab as much as they can. Also, this:

var r = /d+/;

is equivalent to:

var r = new RegExp("d+");

See the details for the RegExp object.

The above will grab the first group of digits. You can loop through and find all matches too:

var r = /d+/g;
var s = "you can enter 333 maximum 500 choices";
var m;
while ((m = r.exec(s)) != null) {
  alert(m[0]);
}

The g (global) flag is key for this loop to work.

answered Oct 26, 2009 at 5:30

cletus's user avatar

cletuscletus

613k167 gold badges909 silver badges942 bronze badges

1

const str = "you can enter maximum 500 choices";
const result = str.replace(/[^0-9]/g, "");
console.log(result); // "500"

playground: https://regex101.com/r/1ADa3c/1

answered Mar 2, 2018 at 9:06

Artem Belik's user avatar

Artem BelikArtem Belik

4724 silver badges7 bronze badges

I like @jesterjunk answer,
however, a number is not always just digits. Consider those valid numbers:
“123.5, 123,567.789, 12233234+E12”

So I just updated the regular expression:

var regex = /[d|,|.|e|E|+]+/g;

var string = "you can enter maximum 5,123.6 choices";
var matches = string.match(regex);  // creates array from matches

document.write(matches); //5,123.6

answered Mar 23, 2017 at 9:41

Dudi's user avatar

DudiDudi

3,0491 gold badge26 silver badges23 bronze badges

1

I thought I’d add my take on this since I’m only interested in the first integer I boiled it down to this:

let errorStringWithNumbers = "error: 404 (not found)";        
let errorNumber = parseInt(errorStringWithNumbers.toString().match(/d+/g)[0]);

.toString() is added only if you get the “string” from an fetch error. If not, then you can remove it from the line.

answered Feb 23, 2021 at 10:50

Jimmy Westberg's user avatar

var regex = /d+/g;
var string = "you can enter 30%-20% maximum 500 choices";
var matches = string.match(regex);  // creates array from matches

document.write(matches);

answered Nov 29, 2018 at 8:04

arvind's user avatar

arvindarvind

511 silver badge1 bronze badge

0

You can also try this :

var string = "border-radius:10px 20px 30px 40px";
var numbers = string.match(/d+/g).map(Number);
console.log(numbers)

answered May 28, 2019 at 7:20

MohammadTausif Shaikh's user avatar

Now this is very easy to do using the ‘replace’ method and ‘regexp’. For example:

findNumber = str => {
  return +(str.replace(/D+/g, ''));
}

console.log(findNumber("you can enter maximum 500 choices"));
console.log(findNumber("you can enter maximum 12500 choices"));

answered Jan 4, 2022 at 7:26

Kirilo Lozitsky's user avatar

Let’s start with an explanation of your approach before we get to an answer.

Starting with your string String str = "String4", I’m assuming that you pass it to checkString().

The indexOf() function for a string searches the string for a substring (a character in your case) and returns its position, indexed from 0. For example, if you call str.indexOf("t") it will return 1 because the character t is in position 1. Therefore, in your code you check if the numbers 3, 4, and 5 reside in the strings index 0 (the first character).

If you want to use indexOf() for this function, you can check if the number is in the string in the first place. IndexOf() returns -1 if the character your searching for isn’t in the string, so you can use the following:

if (str.indexOf("3") != -1){
    //do your stuff
}

And the same for 4 and 5.

Чтобы найти числа определенной длины, N – это строка, используйте регулярное выражение [0-9] + для поиска числовых строк любой длины. [0-9] соответствует одной цифре. После того, как вы найдете все элементы, отфильтруйте их по указанной длине.

Пример 1

В следующем примере мы берем строку и находим в ней все трехзначные числа.

import re

str = 'We four guys, live at 2nd street of Malibeu 521. I had a cash of $248 in my pocket. I got a ticket with serial number 88796451-52.'

#search using regex
x = re.findall('[0-9]+', str)
print('All Numbersn',x)

#digits of length N
N=3

def filterNumber(n):
	if(len(n)==N):
		return True
	else:
		return False
		
#filter the list
finalx = list(filter(filterNumber, x))
print('Final Listn',finalx)

Вывод:

All Numbers
 ['2', '521', '248', '88796451', '52']
Final List
 ['521', '248']

Ниже приводится объяснение наиболее заметных программных операторов в приведенном выше примере:

  1. re.findall (‘[0-9] +’, str) возвращает все слова, которые являются числами.
  2. Функция filterNumber(n) возвращает истину, если длина числа n равна указанной нами длине N.
  3. Отфильтруйте список, возвращенный на шаге 1, с помощью функции, определенной на шаге 2.
  4. Фильтр на шаге 3 возвращает список, содержащий числа указанной длины.

Мы узнали, как получить список чисел определенной длины, используя регулярное выражение в Python.

Как получить список всех чисел из строки?

Чтобы получить список всех чисел в строке, используйте регулярное выражение «[0-9] +» с методом re.findall(). [0-9] представляет собой регулярное выражение, соответствующее одной цифре в строке. [0-9] + представляет собой непрерывные последовательности цифр любой длины.

numbers = re.findall('[0-9]+', str)

Где, str – строка, в которой нам нужно найти числа. re.findall() возвращает список строк, соответствующих регулярному выражению.

Пример 1

В следующем примере мы возьмем строку. Мы живем по адресу 9–162, Малибеу. Мой номер телефона – 666688888. Я найду все числа [‘9’, ‘162’, ‘666688888’], присутствующие в строке.

import re

str = 'We live at 9-162 Malibeu. My phone number is 666688888.'
#search using regex
x = re.findall('[0-9]+', str)
print(x)

Вывод:

['9', '162', '666688888']

Пример 2: получение списка всех непрерывных цифр в строке

В следующем примере мы возьмем строку: Мы, четверо, живем на 2-й улице Малибеу. У меня в кармане было 248 долларов наличными. Я получил билет с серийным номером 88796451-52. И нахожу все числа [‘2’, ‘248’, ‘88796451’, ’52’], присутствующие в строке.

import re

str = 'We four guys, live at 2nd street of Malibeu. I had a cash of $248 in my pocket. I got a ticket with serial number 88796451-52.'
#search using regex
x = re.findall('[0-9]+', str)
print(x)

Вывод:

['2', '248', '88796451', '52']

Мы узнали, как получить все числа в виде строки в виде списка, используя регулярные выражения в Python, с помощью примеров программ.

Как получить список всех чисел из строки?

Чтобы получить список всех чисел в строке, используйте регулярное выражение «[0-9] +» с методом re.findall(). [0-9] представляет собой регулярное выражение, соответствующее одной цифре в строке. [0-9] + представляет собой непрерывные последовательности цифр любой длины.

numbers = re.findall('[0-9]+', str)

Где, str – строка, в которой нам нужно найти числа. re.findall() возвращает список строк, соответствующих регулярному выражению.

Пример 1

В следующем примере мы возьмем строку. Мы живем по адресу 9–162, Малибеу. Мой номер телефона – 666688888. Я найду все числа [‘9’, ‘162’, ‘666688888’], присутствующие в строке.

import re

str = 'We live at 9-162 Malibeu. My phone number is 666688888.'
#search using regex
x = re.findall('[0-9]+', str)
print(x)

Вывод:

['9', '162', '666688888']

Пример 2: получение списка всех непрерывных цифр в строке

В следующем примере мы возьмем строку: Мы, четверо, живем на 2-й улице Малибеу. У меня в кармане было 248 долларов наличными. Я получил билет с серийным номером 88796451-52. И нахожу все числа [‘2’, ‘248’, ‘88796451’, ’52’], присутствующие в строке.

import re

str = 'We four guys, live at 2nd street of Malibeu. I had a cash of $248 in my pocket. I got a ticket with serial number 88796451-52.'
#search using regex
x = re.findall('[0-9]+', str)
print(x)

Вывод:

['2', '248', '88796451', '52']

Мы узнали, как получить все числа в виде строки в виде списка, используя регулярные выражения в Python, с помощью примеров программ.

Есть строка:

let stroka = '23 cтроителя из бригады 15.0 залили 604,8 м бетона из необходимых 1042 м. Это -36 м от нормы.'

В этой строке есть 4 числа:

23
15.0
604,8
1042
-36

Нам нужно определить какое из них чётное.

Логика решения задачи

На самом первом этапе нужно определиться, какую часть символов из строки мы будем считать числом. Предлагаю учитывать любую последовательность из символов — «0123456789,.-«.

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

Поиск чисел-строк через регулярное выражение

Шаг № 1 — Вытаскиваем любые последовательности символов, похожие на числа

Мы создадим регулярное выражение. Оно будет сопоставляться глобально по всей строке при помощи метода [Symbol.match]. Внутри шаблона регулярного выражения будет жить Класс Символа с Квантификатором.

/([0123456789,.-])+/g[Symbol.match](stroka)

Такое сопоставление вернёт нам все возможные числа в виде массива, подходящие под условие отбора.

['23', '15.0', '604,8', '1042', '.', '-36', '.']

Скриншот из браузера:

Отобрали последовательности в строке, похожие на числа - JavaScript

Отобрали последовательности в строке, похожие на числа — JavaScript

Шаг № 2 — Фильтрация от нечётных и дробных

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

Примечание!

Сейчас мы делаем так, потому что не ожидаем увидеть числа 14.00 или 14,00.

Внутри фильтра будет работать функция с таким условием:

!i.includes(/[.,]|[^02468]$/g.exec(i))

Мы пробрасываем в неё элемент массива i, у которого проверяется вхождение на:

  • символы точки и запятой — [.,]
  • отсутствие вхождения цифр 0, 2, 4, 6, 8 — [^02468]. Знак крышечки «^» обозначает отрицание в Классе Символа.

Почему отрицание на возврате includes()? Всё дело в работе метода exec()

/[.,]|[^02468]$/g.exec('23')
['3', index: 1, input: '23', groups: undefined]
/[.,]|[^02468]$/g.exec('15.0')
['.', index: 2, input: '15.0', groups: undefined]
/[.,]|[^02468]$/g.exec('604,8')
[',', index: 3, input: '604,8', groups: undefined]
/[.,]|[^02468]$/g.exec('1042')
null

По таким условиям, подходящие нам числа (которые строки) будут возвращать null после вызова exec(). На одном из этапов работы метода filter() срабатывает приведение к логическому типу Boolean().

Boolean(null)
false

Boolean(',')
true

Приведение null к логическому типу даёт false, но во всех найденных сопоставлениях будет true. Это значит, что для возврата нужного нам значения нужно поменять истину на ложь и ложь на истину, чтобы фильтр корректно отработал.

На выходе мы имеем:

/([0123456789,.-])+/g[Symbol.match](stroka).filter(i=>!i.includes(/[.,]|[^02468]$/g.exec(i)))
['1042', '-36']

Скриншот из браузера:

Получили чётные числа из строки - JavaScript

Получили чётные числа из строки — JavaScript

Учёт нулей после запятой или точки

Чётные числа могут быть записаны в формате дробной части, где после запятой или точки просто проставляются нули. Их количество может быть разной длины. Эта задача немного сложнее:

let str2 = 'Молоко3.0литра Творог2,00кг Сметана1.00литра Кефир0,0литра Простокваша,0000 Сыр.000 Орехи,0134 Картошка.735 Хлеб,521 Рис.04'

Ещё могут встретиться числа где опускается целая часть. Её бы тоже неплохо учитывать.

Как учитывать подобные числа?

Заменяем случаи на НОЛЬ:

  • ,0000
  • .000
  • 0,0

replace(/^(0+)*?[.,]0+$/, ‘0’)

Фильтруем результаты:

/([0123456789,.-])+/g[Symbol.match](stroka).map(i=>i.replace(/^(0+)*?[.,]0+$/, ‘0’)).filter(i=>!i.includes(/[^02468]([.,])?/g.exec(i)))

Информационные ссылки

Стандарт ECMAScript — https://tc39.es/ecma262/multipage/

Стандарт ECMAScript — Раздел «22.2 RegExp (Regular Expression) Objects» — https://tc39.es/ecma262/multipage/text-processing.html#sec-regexp-regular-expression-objects

19 ответов

397

17 декабря 2007 года

SergPas

527 / / 03.02.2007

Только путём посимвольного анализа строки.

12K

18 декабря 2007 года

St0p

59 / / 15.04.2007

for(i=0; i<n; i++)//n – длинна строки, чтобы её найти можно использовать, например, strlen()
{
if(str==z)//str – стока, z – искомое число
{
y=z;
}
}
всё. Теперь возвращаешь y и его место под солнцем.

397

18 декабря 2007 года

SergPas

527 / / 03.02.2007

Цитата:

for(i=0; i<n; i++)//n – длинна строки, чтобы её найти можно использовать, например, strlen()
{
if(str==z)//str – стока, z – искомое число
{
y=z;
}
}

Вот пример плохого кода. 😮

12K

18 декабря 2007 года

St0p

59 / / 15.04.2007

Вот пример плохого кода. 😮

Многоуважаемый товарищ) В данном случае я и не претендую) Дело в том, что я знаю, что этот код врятли будет использован вообще кем-либо когда-либо. И не приведи господь, если кому-то он понравится.. Но суть вопроса, имхо, он отображает вполне конкретезировано. Прогнать строку, выцепить понравившийся элемент и вернуть его.) Если чем-то задел – извиняюсь, не специально.)

255

18 декабря 2007 года

Dart Bobr

1.4K / / 09.04.2004

Уважаемый, начнем с того, что данный код просто не рабочий.
Потому-что:
он ищет цифры а не числа (вы пробовали его запустить на приведенном афтором топика примере?сомневаюсь), к тому же вы не описали типов и не инициализировали переменнные, а для автора топика, готов поспорить, это является не очевидным. (к тому же у вас отсутствует приведение из типа char в int. так как 0х03 не есть символом ‘3’, к примеру!! )
Так зачем тогда постить заведомо неправильный код? Даже если он, по вашему мнению, не будет ни разу использован, имейте уважение к тем, кто будет читать этот топик и не пишите глупостей, если вы их осознаете.

З.Ы. Стиль написания честно ужастный, без обид. К тому же почему бы не использовать (смотрим на название раздела) С++ а не С?

13K

18 декабря 2007 года

specter

113 / / 28.09.2007

строка задана как char, в ней есть буквы, разные знаки + какое-либо целое число.
например PEREMENNAYA=124
подскажите, как из такой строки выделить число в отдельную переменную?

Тут удобнее всего будет использовать регулярные выражения 😉

6.4K

18 декабря 2007 года

Host

122 / / 22.09.2005

…подскажите, как из такой строки выделить число в отдельную переменную?

Код:

[SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] NumberFromString([/SIZE][SIZE=2][COLOR=#0000ff]const [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]char[/COLOR][/SIZE][SIZE=2]* szTestString)[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff]for[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] i = 0; i<strlen(szTestString); i++)[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff]   if[/COLOR][/SIZE][SIZE=2](isdigit(szTestString))[/SIZE]
[SIZE=2]   {[/SIZE]
[SIZE=2][COLOR=#0000ff]      return[/COLOR][/SIZE][SIZE=2] atoi(&szTestString);[/SIZE]
[SIZE=2]   }[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][SIZE=2] -1;[/SIZE]
[SIZE=2]}[/SIZE]

12K

18 декабря 2007 года

St0p

59 / / 15.04.2007

Уважаемый, начнем с того, что данный код просто не рабочий.
Потому-что:
он ищет цифры а не числа (вы пробовали его запустить на приведенном афтором топика примере?сомневаюсь), к тому же вы не описали типов и не инициализировали переменнные, а для автора топика, готов поспорить, это является не очевидным. (к тому же у вас отсутствует приведение из типа char в int. так как 0х03 не есть символом ‘3’, к примеру!! )
Так зачем тогда постить заведомо неправильный код? Даже если он, по вашему мнению, не будет ни разу использован, имейте уважение к тем, кто будет читать этот топик и не пишите глупостей, если вы их осознаете.

З.Ы. Стиль написания честно ужастный, без обид. К тому же почему бы не использовать (смотрим на название раздела) С++ а не С?

Согласен, виноват, испарвлюсь) Убидили)

32K

20 декабря 2007 года

Mayachok

5 / / 17.12.2007

спасибо всем. с помощью регулярок сделаю (вот только надо будет подучиться с ними работать)

538

21 декабря 2007 года

AVDEY

188 / / 17.11.2005

Вот как я использовал перевод строки в числовой тип double:

Код:

double StringDouble(CString Sstr)
{

char cBuf;
double ret=0,iDrob=1,iDrobBuf=1;
int iSize=0,iMeter=0,iCile=10,iZnak=1;

iSize=Sstr.GetLength();
if(iSize==0)return 0;
if((Sstr.GetAt(0))==’-‘)
{iZnak=-1;iMeter++;}
while(iMeter<iSize)
        {

cBuf=Sstr.GetAt(iMeter);
iDrob=iDrob*iDrobBuf;

           
    switch(cBuf)
    {
        case ‘.’:{iCile=1;iDrobBuf=0.1;}break;
        case ‘0’:ret=ret*iCile+0*iDrob;break;
        case ‘1’:ret=ret*iCile+1*iDrob;break;
        case ‘2’:ret=ret*iCile+2*iDrob;break;
        case ‘3’:ret=ret*iCile+3*iDrob;break;
        case ‘4’:ret=ret*iCile+4*iDrob;break;
        case ‘5’:ret=ret*iCile+5*iDrob;break;
        case ‘6’:ret=ret*iCile+6*iDrob;break;
        case ‘7’:ret=ret*iCile+7*iDrob;break;
        case ‘8’:ret=ret*iCile+8*iDrob;break;
        case ‘9’:ret=ret*iCile+9*iDrob;break;

   
    }
iMeter++;}
ret=ret*iZnak;

return ret;
}

Но это было сделано только для того случая, когда заранее известно что строка содержит только цифровые символы, иначе эта функция просто сложит все цифровые символы в одну цифру.
Если я правильно понял вопрос думаю что подойдет,если дописать:

Код:

switch(…)
{
case 0:{}break;
//………………………….
//………………………….
//………………………….
 default: {ret=ret*iZnak; return ret;}
}

32K

24 декабря 2007 года

Mayachok

5 / / 17.12.2007

возможно ли сделать это без регулярных выражений?
в строке присутствуют не только цифры, но и символы. причем какое чилсо будет в строке – неизвестно. как раз его и надо найти

1.6K

24 декабря 2007 года

Vov4ick

476 / / 01.02.2007

Примерно такой алгоритм:
Проходим строку посимвольно, пока не встретим конец строки, либо пока не встретим символ ( char >=’0′ && char <=’9′ ). Если конец строки – выход.
Если символ встретили, записываем в конец пустой строки пока. Далее проходим оставшуюся часть строки пока ( char >=’0′ && char <=’9′ ).
Далее sprintf() с нужными параметрами.
В случае чисел с плав. запятой в оба сравнения добавляется проверка на запятую или точку.
При необходимости разбора массива повторяем до встречиконца строки.

3

24 декабря 2007 года

Green

4.8K / / 20.01.2000

Вот как я использовал перевод строки в числовой тип double:

Код:

switch(cBuf)
    {
        case ‘.’:{iCile=1;iDrobBuf=0.1;}break;
        case ‘0’:ret=ret*iCile+0*iDrob;break;
        case ‘1’:ret=ret*iCile+1*iDrob;break;
        case ‘2’:ret=ret*iCile+2*iDrob;break;
        case ‘3’:ret=ret*iCile+3*iDrob;break;
        case ‘4’:ret=ret*iCile+4*iDrob;break;
        case ‘5’:ret=ret*iCile+5*iDrob;break;
        case ‘6’:ret=ret*iCile+6*iDrob;break;
        case ‘7’:ret=ret*iCile+7*iDrob;break;
        case ‘8’:ret=ret*iCile+8*iDrob;break;
        case ‘9’:ret=ret*iCile+9*iDrob;break;

   
    }

Жуть… 🙂
Хорошо, что цифр всего 10. :D:D

353

24 декабря 2007 года

Nixus

840 / / 04.01.2007

Код:

#include <stdio.h>

int getNum(const char* szStr)
{
    int outNum = 0;
    int bNum = 0;
    const char *p = szStr;

    while(*p)
    {
        if(*p >= ‘0’ && *p <= ‘9’)
        {
            bNum = 1;
            outNum = outNum* 10 + (*p – ‘0’);
        }
        else
        {
            if(bNum)
                break;
        }

        p++;
    }

    return outNum;
}

main()
{
    printf(“%in”, getNum(“qwe=123wer”));
    printf(“%in”, getNum(“gkwehrkjhwekt679012wer”));
    printf(“%in”, getNum(“qwkehqwkjeg64897126498qwr”));
}

538

24 декабря 2007 года

AVDEY

188 / / 17.11.2005

Жуть… 🙂
Хорошо, что цифр всего 10. :D:D

А что есть другие варианты, кроме сравнения символов.
И задача стоит определить именно цифры.

3

24 декабря 2007 года

Green

4.8K / / 20.01.2000

А что есть другие варианты, кроме сравнения символов.
И задача стоит определить именно цифры.

А зачем сравнивать все символы?
Для того, чтоб определить, что символ является цифрой, достаточно сделать такую проверку:

Код:

а для того, чтоб определить, какой цифрой является символ достаточно произвести такое действие:

Код:

Т.о. твой гигантский switch вырождается в следущее:

Код:

if(ch == ‘.’) {
        …..
    } else {
        unsigned int val = ch – ‘0’;
        if(val <= 9) {
            …..
        }
    }

Да и ещё, для точности, я бы не выделял бы сначала целую и дробную часть, а сначала сконвертировал бы строку чисел в целочисленное значение (без учета точки), а уж потом разделил бы.

353

25 декабря 2007 года

Nixus

840 / / 04.01.2007

Да и ещё, для точности, я бы не выделял бы сначала целую и дробную часть, а сначала сконвертировал бы строку чисел в целочисленное значение (без учета точки), а уж потом разделил бы.

А еще луше два целых для хранения целой и дробной части отдельно и последующего перевода.

32K

25 декабря 2007 года

Mayachok

5 / / 17.12.2007

сделала вот так вот:

int NumberFromString(const char* szTestString)
{
for(int i = 0; i<strlen(szTestString); i++)
{
if(isdigit(szTestString))
{
return atoi(&szTestString);
}
}
}

работает как надо и занимает мало места 🙂

538

25 декабря 2007 года

AVDEY

188 / / 17.11.2005

Спасибо за предложенные варианты, переделаю функцию, а то ту функцию я писал когда еще был на втором или на первом курсе института. И как то не было обходимости чтото изменять.

Добавить комментарий