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 № 1Ekspresja (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 nimfred
. - Gdyby
|
był włączający lub, pasowałby, gdyby znalazł „lub”, „i” lub oba bezpośrednio po nimfred
.
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