/ / Regex za znalezienie pierwszego wystąpienia ceny - wyrażenie regularne

Regex za znalezienie pierwszego wystąpienia ceny - regex

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 № 1

Wyglą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:

wprowadź opis obrazu tutaj