Muszę wydobyć tylko 94.00
z ciągu poniżej.
Którego regex użyłbym, aby to zrobić? Moje obecne wyrażeń regularnych [^$]+$
wraca $99.00 (176)
5 Easy Payments $94.00 $99.00 (176)
Odpowiedzi:
2 dla odpowiedzi № 1Wygląda na to, że możesz chcieć użyć tego wyrażenia regularnego:
$[d.]+
Dopasowuje wszystkie ceny, więc w zależności od języka, juse użyje tej funkcji, aby uzyskać pierwsze wystąpienie. Jednak będzie to również pasować do czegoś niedorzecznego $......
jako cena.
$[d]+.[d]+
dopasuje tylko ceny w formularzu $123.456
z dowolną liczbą cyfr.
^[^$]+$[d]+.[d]+
dopasuje wszystko do ostatniej cyfry w cenie. Jest to bezużyteczne w obecnym stanie, ponieważ powraca 5 Easy Payments $94.00
dla twojego ciągu testowego.
^[^$]+($[d]+.[d]+)
dopasuje to samo co powyżej, ale grupa nr 1 wyrażenia regularnego będzie ceną $94.00
. Jeśli chcesz tylko dopasować samą liczbę, przesuń lewy wspornik, aby się stał ^[^$]+$([d]+.[d]+)
.
Problem polega na tym, że to nie zwróci żadnych dopasowań, jeśli pojawi się niedrogi znak dolara gdzieś przed pierwszą prawidłową ceną. Tak długo, jak to nie jest kwestia, ^[^$]+$([d]+.[d]+)
da tobie 94.00
dla grupy przechwytującej 1.
1 dla odpowiedzi nr 2
Musisz użyć mechanizmu przechwytywania, jeśli nie możesz użyć żadnej normalnej metody programowania do kontrolowania ilości dopasowań, które otrzymujesz:
/($d+(?:.d+)?)[sS]*/
To wyrażenie znajduje pierwszą (ponieważ dowolny silnik regex przetwarza ciąg od lewej do prawej, przynajmniej domyślnie) $
+1 or more digits
+an optional sequence of "." and 1 or more digits
, przechwytuje ten tekst do grupy 1 (z ($d+(?:.d+)?)
) i wtedy mecze i konsumuje cała reszta łańcucha z [sS]*
(dowolne 0 lub więcej znaków).
Twoja wartość jest w grupie 1: