Wyrażenia regularne

0

Próbuję zbudować wyrażenie regularne, które wyłapie mi taki tekst
" jakis tekst // komentarz"

przy czym komentarz jest opcjonalny, a liczba białych znaków może być dowolna (także zerowa).
czyli generalnie: dowolna liczba białych znaków | jakiś tekst zawierający białe znaki (ale nie na końcu i początku) | białe znaki lub nie | tekst zaczynający się od //

Nie wiem jak to rozwiązać. Używałem kregexpeditora, ale nie pomógł mi :/

0

A takie cos?
\s*.*\s*//\s*.*

IMO mozesz tez szukac po prostu "//", jesli to komentarz w kodzie jezyka c-podobnego, bo przeciez pierwsze wystapienie tego ciagu juz jest uznawane za poczatek komentarza.

0

Proponuję takie (w składni Javy):

^(\\s*)(((\\s*)(([^/\\s]|/(?=($|[^/])))+))*)(\\s*)(//.*)?$

^ - początek
(\s+) - opcjonalne spacje na początku
((\s*)(([/\s]|/(?=($|[/])))+))*- słowa z opcjonalnymi białymi znakami poprzedzającymi
Składa się z:

  1. (\s*) - znaki białe przed wyrazem
  2. ([/\s]|/(?=($|[/])))+) - pojedyncze słowo - ciąg znaków bez znaków białych. Znak / może wystąpić tylko wtedy, gdy następny nie równy /
    (\s*) - opcjonalne znaki białe pomiędzy tekstem i komentarzem
    (//.*)? - opcjonalny komentarz
    $ - koniec linii

Dla przykładu
" jakis / tekst / // komentarz"
druga grupa będzie równa "jakis / tekst /"

0

Chciałbym wykorzystać coś takiego:
[\s\t](.[\s\t])[\s\t](//.)?$
ale nie wiem dlaczego nie chce mi zrozumieć "?". Próbowałem też z {0,1}, ale też nie działa. Co ciekawe, {1} działa.

piszę to za pomocą regexów z Boosta.

0

?, * lub {0, 1} oznaczają, że danej grupy może w ogóle nie być. A zatem idąc od prawej masz

  • opcjonalny komentarz: (//.*)?
  • opcjonalne białe znaki: [\s\t]*
  • dowolne znaki: (.*[^\s\t]) - gwiazdka w tym przypadku jest zachłanna ("greedy"). Ponieważ dalszy tekst, tj. białe znaki i komentarz równie dobrze pasują do tej grupy (kropka = dowolny znak) to zostaną właśnie do niej przypisane.

Aby to zmienić potrzebujesz gwiazdki w wersji "non-greedy", czyli gwiazdki z pytajnikiem: *? (na tej samej zasadzie działają operatory +? i ??).

Np w Pythonie mogłoby to wyglądać tak:

>>> import re
>>> r = re.compile('''^\s*      # biale znaki na poczatku
...                   (.*?)     # dowolny tekst
...                   \s*       # biale znaki po tekscie
...                   (//.*)?$  # opcjonalny komentarz''', re.VERBOSE)
>>> r.match("        jakis tekst  // komentarz ").groups()
('jakis tekst', '// komentarz ')

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