2013-06-13 17 views
8

Próbuję dopasować liczbę na końcu ciągu, używając wyrażenia regularnego. Na przykład, łańcuch może wyglądać następująco:RegEx pasuje do liczby na końcu ciągu znaków

var foo = '101*99+123.12'; // would match 123.12 
var bar = '101*99+-123'; // would match -123 
var str = '101*99+-123.'; // would match -123. 

To, co mam tak daleko, ale wydaje się, aby dopasować cały ciąg, jeśli nie ma przecinka dziesiętnego:

foo.match(/\-?\d+.?\d+?$/); 

biorę to znaczy:

  • \-?: opcja "-" symbol
  • \d+: 1 lub więcej cyfr
  • .?: opcjonalnie punkt dziesiętny
  • \d+?: opcja 1 lub więcej cyfr po kropce dziesiętnej
  • $: mecz na końcu łańcucha

Czego mi brakuje?

+3

Dziękuję za rzeczywiście próbuje coś, pokazując swoją pracę, a wyjaśniając. Mogłoby być lepiej, gdyby było zawarte jsFiddle, ale żebracy nie mogą być wybieralni ... :) Jedna szybka notatka - '.' w środku regex oznacza" dowolny znak "(w zasadzie), a nie" okres "; Myślę, że powinieneś uciec przed nim, być "\.?". To może nie być jedyny problem, po prostu coś, co zauważyłem w twoim opisie regex – Ian

+1

Wow ... Popatrz, jak najprostsze pytanie staje się dużo przebojów, gdy OP wkłada wysiłek. Twoje zdrowie! – jahroy

+0

Czy ciąg znaków będzie zawsze wyglądał jak "x * y + z"? – Xotic750

Odpowiedz

3

. pasuje do dowolnej postaci. Musisz uciec jak \.

Spróbuj tego:

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

Czyli:

-?   // optional minus sign 
\d+   // one or more digits 
\.?   // optional . 
\d*   // zero or more digits 

Jak widać na MDN's regex page, +? jest non-chciwy mecz 1 lub więcej, nie opcjonalne dopasowanie 1 lub więcej.

+0

Och, nie zdawałem sobie sprawy, że muszę uciec od '.'. Zakładam, że '+?' Odnosi się do dopasowania ostatnich cyfr? – Phil

+0

ukradłeś moją odpowiedź? –

+2

@ Vitim.us - (w przypadku, gdy nie żartujesz) Nie ukradł twojej odpowiedzi: odpowiedział przed tobą i od tego czasu nie edytował swojej odpowiedzi. Opierając się na komentarzach, wygląda na to, że pomógł naprawić twoją odpowiedź, więc mam nadzieję, że żartujesz. – jahroy

0

Kilka kwestii:

  • marginesie: kreska nie musi być uciekł; to tylko specjalne klasy znaków (np. [a-z]).
  • kropka jest specjalna; oznacza "dopasuj dowolną postać". Będziesz chciał uciec: \.
  • \d+? faktycznie oznacza: dopasuj co najmniej jedną cyfrę, ale jeśli regex idzie dalej po tej części wzoru, spróbuj jak najszybciej dopasować pozostałe wyrażenie ("lazy" lub "nie-chciwe dopasowanie"). W twoim przypadku ten ? po prostu nic nie robi. Aby te cyfry były opcjonalne, użyj \d*.
  • Wreszcie może chcesz, aby punkt dziesiętny, a kolejne cyfry opcjonalnego jako grupa: (\.\d+)?

Streszczenie: /-?\d+(\.\d+)?$/

0

To powinno załatwić sprawę /-?\d+\.?\d*$/

result = subject.match(/-?\d+\.?\d*$/mg); 

enter image description here enter image description here

+0

To nie będzie pasować do trzeciego przypadku OP z końcowym separatorem dziesiętnym. Również (z pierwszego przykładu) nie chcą dopasowywać '+'. – nnnnnn

+0

@nnnnnn ops ... naprawiono –

+2

Co wykorzystałeś do analizy wyrażenia regularnego? – MaxArt

0

Jeśli wzorzec jest zawsze x*y+z, można to zrobić alternatywnie bez takiego wyrażenia regularnego.

var foo = '101*99+123.12'; // would match 123.12 
var bar = '101*99+-123'; // would match -123 
var str = '101*99+-123.'; // would match -123. 

function getLastNumber(string) { 
    return string.split("+")[1]; 
} 

console.log(getLastNumber(foo)); 
console.log(getLastNumber(bar)); 
console.log(getLastNumber(str)); 

Wyjście

123.12 
-123 
-123. 

Na jsfiddle

Powiązane problemy