Wyrażenie regularne

0

Hejka,

Jak skonstruować wyrażenie regularne które z ciągu znaków:

dowolny znak 1 x12,00 12,00B dowolny znak
lub
dowolny znak 1 x 12,00 12,00B dowolny znak
lub
dowolny znak 1x 12,00 12,00B dowolny znak
lub
dowolny znak 1 x 12,00 12,00B dowolny znak

liczby są różne i mogą się zmieniać

znajdzie 1 x 12,00 ? :)

5

Jeśli chcesz wyciągnąć każdą liczbę oddzielnie, to

(\d+)\s*?x\s*?(\d+),(\d+)\s*?(\d+),(\d+)(\w)

... albo uznać, że 12,00 to liczba zmiennoprzecinkowa

(\d+)\s*?x\s*?(\d+,\d+)\s*?(\d+,\d+)(\w)

Polecam pobawić się dopasowaniami na stronie https://regexr.com/

x wpisałem na sztywno, bo rozumiem, że to będzie cały czas takie samo.

1

Może coś takiego: ([1-9][0-9]*)\s*x\s*([1-9][0-9]*,\d+)?
Zakładam, że zawsze używany jest przecinek i zawsze istnieje część zmiennoprzecinkowa.

1
damianem napisał(a):

Może coś takiego: ([1-9][0-9]*)\s*x\s*([1-9][0-9]*,\d+)?
Zakładam, że zawsze używany jest przecinek i zawsze istnieje część zmiennoprzecinkowa.

Używasz tu operatora zachłannego (gwiazdka). W tym miejscu możesz mieć błędne dopasowania. Operator zachłanny rzadko kiedy jest potrzebny.
Sprawdzałeś czy to działa?

3

Czy liczba z lewej strony xa: 1 x 12,00 zawsze jest integerem, z prawej zawsze zmiennoprzecinkowa?

EDYCJA:
@PerlMonk: Drugie nie działa jak powinno, (łapie za dużo): https://regex101.com/r/txU3DZ/1
@damianem @PerlMonk: tu akurat miałeś rację, bo ten regex udało się popsuć takim stringiem: https://regex101.com/r/txU3DZ/2

0
lion137 napisał(a):

Czy liczba z lewej strony xa: 1 x 12,00 zawsze jest integerem, z prawej zawsze zmiennoprzecinkowa?

EDYCJA:
@PerlMonk: Drugie nie działa jak powinno, (łapie za dużo): https://regex101.com/r/txU3DZ/1
@damianem @PerlMonk: tu akurat miałeś rację, bo ten regex udało się popsuć takim stringiem: https://regex101.com/r/txU3DZ/2

zawsze int, to ilość
np 2 x 38,50

po prawej cena

0
AfrykanskiPomorSwin napisał(a):
lion137 napisał(a):

Czy liczba z lewej strony xa: 1 x 12,00 zawsze jest integerem, z prawej zawsze zmiennoprzecinkowa?

EDYCJA:
@PerlMonk: Drugie nie działa jak powinno, (łapie za dużo): https://regex101.com/r/txU3DZ/1
@damianem @PerlMonk: tu akurat miałeś rację, bo ten regex udało się popsuć takim stringiem: https://regex101.com/r/txU3DZ/2

zawsze int, to ilość
np 2 x 38,50

po prawej cena

Czyli chcesz dopasować tylko 2 x 38,50 a tego drugiego numerka nie?

2

W takim razie, po skrytykowaniu poprzedników, dodaję swój regex (tak, jest *, nabijam sie na grilla, można zacząć kręcić korbką :)):
https://regex101.com/r/txU3DZ/4

1 użytkowników online, w tym zalogowanych: 0, gości: 1