to be or not to be w regexie

2

Dany jest dowciptas przytoczony przez użytkownika @Marooned
title
który jest niestety sformułowany błędnie.

Ponieważ podczas prób jego poprawnego sformułowania rozbolała mnie głowa, stwierdziłam, że sobek nie będę i może jeszcze kogoś rozboli.

Zadanie:

  1. znaleźć wyrażenie które zwróci coś innego niż false dla każdego ciągu zawierającego bb
    No to jest akurat proste: /bb/

  2. znaleźć wyrażenie które zwróci coś innego niż false dla każdego ciągu NIE zawierającego bb,
    czyli np dla takich ciągów jak: "", "a", "ab", "ba, "abc", "bac", itp.
    I właśnie w tym miejscu boli głowa.

2

[^b]*(b[^b]+)*b?

2

(.*)?

1

W liscie ciagow nie zawierajacych bb zabraklo "b", "ba" itp.

0
Freja Draco napisał(a):

który jest niestety sformułowany błędnie.

Zdefiniuj "błędnie"? Jak dla mnie jest prawidłowy. Masz widocznie inne założenia, co nie czyni tego regexa błędnym.

@enedil podał rozwiązanie. Ciut bym je poprawił:
^[^b]*(?:b[^b]+)*b?$
czyli łapanie całego ciągu plus nie łapanie backreference bo nigdzie z niego nie korzystamy

2
Patryk27 napisał(a):

(.*)?

Moim zdaniem to jest prawidłowa odpowiedź. Regex z koszulki jest zapisem dla two b or two not b a nie dla two b or not two b. Jeśli za to be podstawimy x w cytacie z Szekspira to dostaniemy x or not x co daje zawsze true niezależnie od tego czym jest to x (może to być s.equals("bb"), s.contains("bb") czy cokolwiek innego).

0

/bb|(b[^b]|[^b]b|[^b]{2})/

0
koszalek-opalek napisał(a):

/bb|(b[^b]|[^b]b|[^b]{2})/

Chyba nie całkiem, bo to zadziała tylko dla ciągów dwuliterowych.
Ale dzięki za zainteresowanie tematem :)

0
Freja Draco napisał(a):
koszalek-opalek napisał(a):

/bb|(b[^b]|[^b]b|[^b]{2})/

Chyba nie całkiem, bo to zadziała tylko dla ciągów dwuliterowych.
Ale dzięki za zainteresowanie tematem :)

Czyli ^(bb|((((b[^b]|[^b]b|[^b]{2}).*)|(bb.+))))$

0
KamilAdam napisał(a):
Freja Draco napisał(a):
koszalek-opalek napisał(a):

/bb|(b[^b]|[^b]b|[^b]{2})/

Chyba nie całkiem, bo to zadziała tylko dla ciągów dwuliterowych.
Ale dzięki za zainteresowanie tematem :)

Czyli ^(bb|((((b[^b]|[^b]b|[^b]{2}).*)|(bb.+))))$

Raczej:
/ bb | (b[^b] | [^b]b | [^b]{2} | .{3}.*) /
(spacje dla czytelności).

0

Nie wiem, o czym piszecie, ale

/bb|(b[^b]|[^b]b|[^b]{2}|.{3}.*)/.test('a')
false
/bb|(b[^b]|[^b]b|[^b]{2}|.{3}.*)/.test('aa')
true
/bb|(b[^b]|[^b]b|[^b]{2}|.{3}.*)/.test('b')
false
/bb|(b[^b]|[^b]b|[^b]{2}|.{3}.*)/.test('bb')
true
3

Niestety, składnia regexów skupia się na szukaniu konkretnych wzorców, ale kompletnie ssie w przypadku szukania czegoś co nie pasuje do zadanego wzorca.

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