• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wyrażenia regularne.

Object Storage Arubacloud
0 głosów
217 wizyt
pytanie zadane 1 marca 2018 w Matematyka, fizyka, logika przez Aisekai Nałogowiec (42,190 p.)

Jaka jest różnica między:

 ^(1+10)+$

a:

 ^(1*10)+$

Jakiej postaci wyrażenia akceptuje ten regex? Nie pytam dlatego, że dostałem jakieś zadanie domowe z tego, tylko w najbliższym czasie mam egzamin na którym może to być. I jak dotąd myślałem, że to umiem - tak jak teraz odpaliłem testera do wyrażeń regularnych, to się zdziwiłem.

Wydawało mi się, że w domknięciu dodatnim, jeżeli dwa wyrazy są połączone znakiem +, to musi wystąpić minimum jeden z tych wyrazów, ale nieważne w jakiej kolejności są te wyrazy. Tzn myślałem, że akceptuje to słowa takie jak:

1, 10, 110, 101, 10101,11110,110 itd.

Natomiast jak wrzuciłem to w testera ( https://www.regextester.com/ ) okazało się, że np nie akceptuje: 

1, 101,10

 Analogicznie nie wiem, jakie ten drugi regex słowa akceptuje.

Z góry dzięki za pomoc. 

komentarz 1 marca 2018 przez mokrowski Mędrzec (155,460 p.)
Pobaw się tym. W łatwy sposób sprawdza umiejętności: https://regexcrossword.com/
komentarz 1 marca 2018 przez Aisekai Nałogowiec (42,190 p.)
Aż tak na razie nie potrzebuję się tego uczyć, bo jeszcze parę innych zagadnień mam do egzaminu. Na razie tylko chciałem wiedzieć, jaka jest różnica między tymi dwoma regexami. Potrzebuję tego do tego, aby móc na egzaminie narysować deterministyczny automat skończony akceptujący słowa postaci np. 11010(1+00)+. Ale dzięki, bo kiedyś (w niedalekiej przyszłości) będę musiał też się nauczyć regexów, jeżeli chciałbym myśleć o pracy w zawodzie.

1 odpowiedź

+4 głosów
odpowiedź 1 marca 2018 przez Tomek Sochacki Ekspert (227,510 p.)
wybrane 1 marca 2018 przez Aisekai
 
Najlepsza
^(1+10)+$

^       //początek ciągu znakowego
(       //początek grupy przechwytującej
   1+   //co najmniej jedna jedynka lub więcej
    1   //dokładnie jedna jedynka (czyli w sumie min. dwie)
   0    //dokładnie jedno zero
)+      //koniec grupy, musi ona wystąpić co najmniej raz
$       //koniec analizowanego ciągu

Testy:

const reg = /^(1+10)+$/;

reg.test('110');    //true
reg.test('1110');   //true
reg.test('11110');  //true
reg.test('110110'); //true

reg.test('10');     //false
reg.test('1010');   //false

i teraz drugi wzorzec:

^(1*10)+$

^       //początek ciągu znakowego
(       //początek grupy przechwytującej
   1*   //dowolna ilość jedynek, w tym zero czyli brak!
    1   //dokładnie jedna jedynka (czyli w sumie min. dwie)
   0    //dokładnie jedno zero
)+      //koniec grupy, musi ona wystąpić co najmniej raz
$       //koniec analizowanego ciągu

Testy:

const reg = /^(1*10)+$/;

reg.test('110');    //true
reg.test('1110');   //true
reg.test('11110');  //true
reg.test('110110'); //true

reg.test('10');     //true
reg.test('1010');   //true

Testy dałem te same w obu przypadkach. Zwróć uwagę na ostatnie przykłady. Drugi regexp ma kwantyfikator * czyli wymaga jednej lub zero jedynek, po których znajduje się jedynka i zero. W konsekwencji akceptuje więc liczbę 10, czego nie zrobi pierwszy regexp, który kwantyfikatorem + wymaga aby pierwsza jedynka pojawiła się co najmniej jeden raz, a po niej kolejna jedynka i zero.

komentarz 1 marca 2018 przez Aisekai Nałogowiec (42,190 p.)
Aaaaaaa, czyli już rozumiem. Dzięki :)
komentarz 2 marca 2018 przez Aisekai Nałogowiec (42,190 p.)

Jeszcze jedno pytanko mam. W skrypcie z Wprowadzenie do Informatyki mam w przykładach:

(1+10)^*

gdzie ^* (indeks górny) jest domknięciem Kleenego (czy jakoś), a '+' nie jest żadnym indeksem tylko operatorem. I w przykładach mam napisane, że to reprezentuje zbiór wszystkich zer i jedynek rozpoczynających się od 1 i nie zawierających podwojonych symboli 0. Według tego, to powinno reprezentować np ciąg: 1 czy 11. Różnica między domknięciem Kleenego a dopełnieniem dodatnim jest taka, że w dopełnieniu dodatnim minimum raz musi się pojawić to co jest w danej grupie, więc zmieniając na takie wyrażenie:

(1+10)^+

Też (wg skryptu) powinno reprezentować 1 czy 11. Więc, czy w skrypcie jest błąd? Czy + pomiędzy 1 a 10 nie odnosi się do dopełnień?

PS: Nie używam tutaj znaków ^ i $, ponieważ w tej sytuacji wyrażenie regularne nie służyłoby raczej do sprawdzania łańcucha, tylko do generowania łańcuchów, czyli cały łańcuch musi być tej postaci. 

komentarz 2 marca 2018 przez Aisekai Nałogowiec (42,190 p.)
Teraz się zastanawiam, czy ten znak '+' po prostu nie oznacza w tym przypadku alternatywy.

Podobne pytania

0 głosów
1 odpowiedź 340 wizyt
pytanie zadane 9 stycznia 2022 w Matematyka, fizyka, logika przez dark41 Użytkownik (760 p.)
0 głosów
2 odpowiedzi 266 wizyt
pytanie zadane 10 czerwca 2023 w JavaScript przez andrzej.polak Nowicjusz (220 p.)
0 głosów
1 odpowiedź 379 wizyt
pytanie zadane 15 października 2020 w Java przez amtrax Dyskutant (9,630 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...