Regex używa javascript do zwracania tylko liczb


138

Jeśli mam ciąg, taki jak „coś12” lub „coś102”, w jaki sposób użyłbym wyrażenia regularnego w javascript, aby zwrócić tylko części liczbowe?

Odpowiedzi:


235

Wyrażenia regularne:

var numberPattern = /\d+/g;

'something102asdfkj1948948'.match( numberPattern )

Spowoduje to zwrócenie tablicy z dwoma elementami w środku: „102” i „1948948”. Działaj tak, jak chcesz. Jeśli nie pasuje do żadnego, zwróci wartość null.

Aby je połączyć:

'something102asdfkj1948948'.match( numberPattern ).join('')

Zakładając, że nie masz do czynienia ze złożonymi liczbami dziesiętnymi, to powinno wystarczyć.


3
błądzić. nie lubię być wybredny, ale zwraca to tablicę, a nie obiekt (przynajmniej w chrome).
Maus

14
Jednak wszystkie tablice są obiektami, prawda?
meder omuraliev

6
@MuhammadUmer - próbowałeś tego?
meder omuraliev

2
@Onza brakuje ci ukośnika przed d, więc.match(/\d+/g)
meder omuraliev

10
@MuhammadUmer, @meder: Powinniście połączyć siły: parseInt('987d98sf79s7f9s8f9sf'.match(/\d+/gi).join(''))
Joisey Mike

203

Możesz także usunąć wszystkie znaki niecyfrowe ( \Dlub [^0-9]):

let word_With_Numbers = 'abc123c def4567hij89'
let word_Without_Numbers = word_With_Numbers.replace(/\D/g, '');

console.log(word_Without_Numbers)


Cóż, poza tym, że OP chce „tylko części liczb”, a nie łańcucha.
Scott Fraley

27

W przypadku liczby z ułamkiem dziesiętnym i znakiem minus używam tego fragmentu:

 var NUMERIC_REGEXP = /[-]{0,1}[\d]*[.]{0,1}[\d]+/g;

'2.2px 3.1px 4px -7.6px obj.key'.match(NUMERIC_REGEXP)
// return ["2.2", "3.1", "4", "-7.6"]

Aktualizacja: - 7/9/2018

Znalazłem narzędzie, które pozwala na wizualną edycję wyrażeń regularnych: JavaScript Parser wyrażeń regularnych i Visualizer .

Aktualizacja:

Oto kolejny, za pomocą którego można nawet debugować wyrażenie regularne: Tester i debugger wyrażeń regularnych online .

Aktualizacja:

Kolejny: RegExr .

Aktualizacja:

Regexper i Regex Pal .


Idealne, jedyne rozwiązanie, które działa z liczbami dziesiętnymi i ujemnymi
ArmaGeddON

18

Jeśli chcesz tylko cyfry:

var value = '675-805-714';
var numberPattern = /\d+/g;
value = value.match( numberPattern ).join([]);
alert(value);
//Show: 675805714

Teraz masz dołączone cyfry


9

Myślę, że chcesz uzyskać liczbę (y) z ciągu. W takim przypadku możesz użyć:

// Returns an array of numbers located in the string
function get_numbers(input) {
    return input.match(/[0-9]+/g);
}

var first_test = get_numbers('something102');
var second_test = get_numbers('something102or12');
var third_test = get_numbers('no numbers here!');

alert(first_test); // [102]
alert(second_test); // [102,12]
alert(third_test); // null

1
Żeby było jasne, get_numbers/1zwraca tablicę łańcuchową, a nie liczbę. Na przykład zwróci: * ["102"]* ["102", "12"]* null
Sơn Trần-Nguyễn

3

IMO, odpowiedź nr 3 w tej chwili autorstwa Chen Dachao jest właściwą drogą, jeśli chcesz uchwycić jakąkolwiek liczbę, ale wyrażenie regularne można skrócić z:

/[-]{0,1}[\d]*[\.]{0,1}[\d]+/g

do:

/-?\d*\.?\d+/g

Na przykład ten kod:

"lin-grad.ient(217deg,rgba(255, 0, 0, -0.8), rgba(-255,0,0,0) 70.71%)".match(/-?\d*\.?\d+/g)

generuje tę tablicę:

["217","255","0","0","-0.8","-255","0","0","0","70.71"]

Zrobiłem przykład gradientu liniowego MDN, aby w pełni przetestować wyrażenie regularne i nie trzeba go tu przewijać. Myślę, że uwzględniłem wszystkie możliwości w zakresie liczb ujemnych, dziesiętnych, sufiksów jednostek, takich jak deg i%, niespójne użycie przecinków i spacji oraz dodatkowe kropki / kropki i znaki łącznika / myślnika w tekście „lin-grad.ient ”. Daj mi znać, jeśli czegoś brakuje. Jedyne, co widzę, że nie obsługuje, to źle sformułowana liczba dziesiętna, taka jak „0..8”.

Jeśli naprawdę chcesz mieć tablicę liczb, możesz przekonwertować całą tablicę w tym samym wierszu kodu:

array = whatever.match(/-?\d*\.?\d+/g).map(Number);

Mój konkretny kod, który analizuje funkcje CSS, nie musi się martwić o nienumeryczne użycie znaku kropki / kropki, więc wyrażenie regularne może być jeszcze prostsze:

/-?[\d\.]+/g

2

Podane odpowiedzi w rzeczywistości nie pasują do Twojego pytania, co oznacza liczbę końcową . Pamiętaj też, że otrzymujesz z powrotem ciąg; jeśli faktycznie potrzebujesz liczby, rzuć wynik:

item=item.replace('^.*\D(\d*)$', '$1');
if (!/^\d+$/.test(item)) throw 'parse error: number not found';
item=Number(item);

Jeśli masz do czynienia z numerycznymi identyfikatorami pozycji na stronie internetowej, kod może również pożytecznie akceptować Element, wyodrębniając liczbę z jej id(lub jej pierwszego elementu nadrzędnego za pomocą id); jeśli masz Eventporęczność, prawdopodobnie możesz również uzyskać Elementz tego.


Chociaż jest to fajna odpowiedź, nie sądzę, aby inne odpowiedzi „w rzeczywistości nie pasowały do ​​pytania”. W rzeczywistości inne odpowiedzi są bardziej wszechstronne. Będą działać z liczbami końcowymi, jak również liczbami w środku. Założenie, że OP chciał, aby działał TYLKO z końcowymi liczbami, jest trochę aroganckie.
Xandor


2

Korzystanie z podziału i wyrażenia regularnego:

    var str = "fooBar0123".split(/(\d+)/);
    console.log(str[0]); // fooBar
    console.log(str[1]); // 0123

1

Zgodnie z odpowiedzią @ Syntle, jeśli masz tylko znaki nienumeryczne, otrzymasz rozszerzenie Uncaught TypeError: Cannot read property 'join' of null.

Zapobiegnie to błędom, jeśli nie zostaną znalezione żadne dopasowania i zwróci pusty ciąg:

('something'.match( /\d+/g )||[]).join('')


0

Jeśli chcesz również liczby oddzielone kropkami / przecinkami, to:

\d*\.?\d*

lub

[0-9]*\.?[0-9]*

Możesz użyć https://regex101.com/, aby przetestować swoje wyrażenia regularne.


0

Wszystko, co mają inne rozwiązania, ale z niewielką weryfikacją

// value = '675-805-714'
const validateNumberInput = (value) => { 
    let numberPattern = /\d+/g 
    let numbers = value.match(numberPattern)

    if (numbers === null) {
        return 0
    }  

    return parseInt(numbers.join([]))
}
// 675805714
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.