Wpis z mikrobloga

Z cyklu wyrażenia regularne: Mam sobie string, który zawiera ułamki zwykłe zapisane w notacji:

- X SEPARATOR Y (bez spacji, dałem je, żeby było czytelniej) gdzie X jest licznikiem, SEPARATOR to pewien string rozdzielający, a Y mianownikiem

- X SEPARATOR Y SEPARATOR Z (również bez spacji) gdzie X to część całkowita, Y to licznik, a Z to mianownik.

Mogą się pojawić obie notacje, wszystko zależy od tego czy pojawią się ułamki z częścią całkowitą czy nie. Ten ciąg będzie wkładany do parsera matematycznego i on oczekuje że przyjdzie to w postaci:

- fraction(x,y) gdzie x jest licznikiem a y mianownikiem

- fraction(x,y,z) gdzie x jest częścią całkowitą, y licznikiem, z mianownikiem.

Teraz tak, oczywistym jest, że "drugi człon" pojawi się zawsze, bowiem ułamek zawsze ma licznik i mianownik - nie zawsze pojawi się liczba całkowita. Póki co zamieniam to w taki sposób, że mam 2 regexpy, jeden dla ułamków z liczbą całkowitą

new RegExp('(\d+)' + FRACTION_SEPARATOR + '(\d+)' + FRACTION_SEPARATOR + '(\d+)', 'g');
i drugi dla tych bez

new RegExp('(\d+)' + FRACTION_SEPARATOR + '(\d+)', 'g');
i zamieniam to w dwóch turach, najpierw te z liczbą całkowitą

'fraction($1, $2, $3)'
a potem bez

'fraction($1, $2)'
Pytanie brzmi, czy da radę to zrobić jednym regexpem? Problem jest taki, że o ile mogę zaznaczyć w regexpie żeby pierwsza część była opcjonalna, o tyle nie wiem jaki dać string transformujący, skoro $3 nie zawsze istnieje #programowanie #regexp i jeszcze #javascript bo rzecz dzieje się w JSie
  • 10
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Marmite: Na szybko, więc pewnie da się lepiej.

Zakładając, że separatorem jest '/'

(?:(\d+)/)?(\d+)/(\d+)(?!/)

W pierwszej grupie zawsze będzie część całkowita, w drugiej licznik, w trzeciej mianownik. Czysty regex, bo nie znam JS :P
  • Odpowiedz
@Marmite: Aha, myślałem, ze te fraction to funkcje z Twojego kodu, a to są ciągi znaków, które chcesz wygenerować tak? No to nie możesz sprawdzić czy $1 istnieje i w zależności od tego generować dwu albo trzyparametrowe?
  • Odpowiedz
@wicikumoza: (#) No właśnie tak obecnie robię - byłem jednak ciekawy czy ten string

fraction($1,$2,$3)
mogę skonstruować w jakiś sposób, żeby drugi przecinek i $3 pojawiały się tylko wtedy, gdy $3 istnieje. Nie znam się na regexpach aż tak, nie wiem czy jest na to jakaś składnia.
  • Odpowiedz
@ogur: (#) To już w sumie czytelniej dla mnie wygląda moja dwuturowa zamiana. Zresztą ona wcale nie jest nieczytelna:

var fractionWithoutInteger = new RegExp('(\d+)' + FRACTION_SEPARATOR + '(\d+)', 'g');
var fractionWithInteger = new RegExp('(\d+)' + FRACTION_SEPARATOR + '(\d+)' + FRACTION_SEPARATOR + '(\d+)', 'g');
var transformedExpression = expression
.replace(fractionWithInteger, 'fraction($1,
  • Odpowiedz
@ogur: (#) Dobra, czekaj, przyjrzałem się tej Twojej funkcji (tej pierwszej) i jednak faktycznie, to jest to co chcę (sorry za takie nieogarnięcie z rana ^^). Dzięki wielkie!

@wicikumoza: (#) Również dziękuję
  • Odpowiedz