/ / Czy obie alternatywy pasują do siebie podczas używania | w wyrażeniach regularnych Perla? - regex, perl

Czy obie alternatywy pasują podczas używania | w wyrażeniach regularnych Perla? - regex, perl

Jestem zdezorientowany co do poniższego wyrażenia regularnego. Pomóż mi to zrozumieć.

my $test = "fred andor berry";
if ($test =~ /fred (and|or) berry/) {
print "Matched!n";
} else {
print "Did not match!n";
}

Myślałem, że będzie pasować, ale pojawia się komunikat „Nie pasowałem!”. Jeśli dodam + w tym tak

my $test = "fred andor berry";
if ($test =~ /fred (and|or)+ berry/) {
print "Matched!n";
} else {
print "Did not match!n";
}

Potem pasuje. Myślałem, że mogę użyć and|or aby dopasować wyrażenie do „i”, „lub” i „andor”. Nie?

Odpowiedzi:

3 dla odpowiedzi № 1

Ekspresja (and|or) będzie pasować and lub or, ale nie andor. Po dodaniu +, zaakceptuje dwa (a właściwie jedno lub więcej) kolejnych dopasowań tego samego wzorca, co pozwala na dopasowanie andor. (Najpierw pasuje and, następnie or.)


11 dla odpowiedzi nr 2

To jest część wyrażenia regularnego (and|or) oznacza dopasowanie „i” lub „lub”, ale nie oba jednocześnie. Gdy dodasz plus do tej grupy, może on dopasować jeden lub więcej razy. Na przykład „fred andandand berry” również byłoby dobrym dopasowaniem /fred (and|or)+ berry/


4 dla odpowiedzi nr 3

Podczas gdy ludzie mają tendencję do czytania a|b jako „a lub b” | nie jest operatorem OR; to jest alternacja operator. Określa zestaw alternatywy za to, co może pasować w tym momencie. Bardziej dokładnym odczytem byłoby „albo” a ”lub„ b ”(ale nie oba).

Kiedy piszesz (and|or)+ dodajesz + kwantyfikator, co oznacza „jeden lub więcej zpoprzedzający atom. ”Efekt jest taki, że zamiast dopasowywać pojedynczą wartość, która może być„ i ”lub„ lub ”, dopasuje szereg wartości, z których każda może być„ i ”lub„ lub ”. dopasuj wszystkie następujące elementy:

and
or
andor
orand
andorand
andandorororandorandand

Jeśli naprawdę chcesz dopasować tylko „i”, „lub” i „andor” (choć nie wiem, dlaczego chcesz), napisz to w następujący sposób:

(and|or|andor)    # capture
(?:and|or|andor)  # don"t capture

w zależności od tego, czy chcesz uchwycić konkretną dopasowaną wartość. (Równina (...) tworzy grupę przechwytywania. (?:...) tworzy przechwytywanie grupowania).


3 dla odpowiedzi № 4

Dopasowując atom, musi pojawić się natychmiast po poprzednim atomie.

Istnieją dwa rodzaje „lub”.

  • Wyłącznie lub
  • Włącznie lub

32

  • Gdyby | był wyłączny lub pasowałby, gdyby znalazł „albo” lub „i” bezpośrednio po nim fred.
  • Gdyby | był włączający lub, pasowałby, gdyby znalazł „lub”, „i” lub oba bezpośrednio po nim fred.

Obie and i or nie można znaleźć natychmiast po fred, więc | jest oczywiście wyłączne lub.


1 dla odpowiedzi nr 5

(i | lub) + oznacza wiele wystąpień, ale przynajmniej jedno z nich. więc pasowałoby również do andand, andorand, orand, ororororand itp.

(i | lub) oznacza albo i lub lub. (fajne wybieranie nazw)

To by pasowało

Fred i jagoda

i dalej

Fred lub jagoda

odpowiednią dokumentację, jeśli chcesz kontynuować regex, znajdziesz na stronie

http://perldoc.perl.org/perlre.html