Perl - wyrażenia regularne
Wyrażenie regularne to ciąg znaków definiujący wyświetlany wzorzec lub wzorce. Składnia wyrażeń regularnych w Perlu jest bardzo podobna do tego, co znajdziesz w innych programach obsługujących wyrażenia regularne, takich jaksed, grep, i awk.
Podstawową metodą stosowania wyrażenia regularnego jest użycie operatorów wiązania wzorca = ~ i !~. Pierwszy operator to operator testu i przypisania.
W Perlu są trzy operatory wyrażeń regularnych.
- Dopasuj wyrażenie regularne - m //
- Zastąpienie wyrażenia regularnego - s ///
- Transliteracja wyrażenia regularnego - tr ///
W każdym przypadku ukośniki działają jak ograniczniki wyrażenia regularnego (regex), które określasz. Jeśli czujesz się komfortowo z jakimkolwiek innym separatorem, możesz użyć zamiast ukośnika.
Operator dopasowania
Operator dopasowania, m //, służy do dopasowania ciągu lub instrukcji do wyrażenia regularnego. Na przykład, aby dopasować sekwencję znaków „foo” do skalarnego bara $ bar, możesz użyć takiego oświadczenia -
#!/usr/bin/perl
$bar = "This is foo and again foo";
if ($bar =~ /foo/) {
print "First time is matching\n";
} else {
print "First time is not matching\n";
}
$bar = "foo";
if ($bar =~ /foo/) {
print "Second time is matching\n";
} else {
print "Second time is not matching\n";
}
Wykonanie powyższego programu daje następujący wynik -
First time is matching
Second time is matching
M // faktycznie działa w taki sam sposób, jak seria operatorów q //. Możesz użyć dowolnej kombinacji naturalnie pasujących znaków, aby działać jako ograniczniki wyrażenia. Na przykład m {}, m () i m> <są prawidłowe. Tak więc powyższy przykład można przepisać w następujący sposób -
#!/usr/bin/perl
$bar = "This is foo and again foo";
if ($bar =~ m[foo]) {
print "First time is matching\n";
} else {
print "First time is not matching\n";
}
$bar = "foo";
if ($bar =~ m{foo}) {
print "Second time is matching\n";
} else {
print "Second time is not matching\n";
}
Możesz pominąć m z m //, jeśli separatory są ukośnikami, ale dla wszystkich innych separatorów musisz użyć przedrostka m.
Zauważ, że całe wyrażenie dopasowujące, czyli wyrażenie po lewej stronie = ~ lub! ~ Oraz operator dopasowania, zwraca wartość true (w kontekście skalarnym), jeśli wyrażenie pasuje. Dlatego oświadczenie -
$true = ($foo =~ m/foo/);
ustawi $ true na 1, jeśli $ foo pasuje do wyrażenia regularnego, lub na 0, jeśli dopasowanie się nie powiedzie. W kontekście listowym dopasowanie zwraca zawartość wszystkich zgrupowanych wyrażeń. Na przykład podczas wyodrębniania godzin, minut i sekund z ciągu czasu możemy użyć -
my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);
Dopasuj modyfikatory operatorów
Operator dopasowania obsługuje własny zestaw modyfikatorów. Modyfikator / g umożliwia dopasowanie globalne. Modyfikator / i sprawi, że w dopasowaniu wielkość liter będzie niewrażliwa. Oto pełna lista modyfikatorów
Sr.No. | Modyfikator i opis |
---|---|
1 | i Sprawia, że wielkość liter w dopasowaniu jest niewrażliwa. |
2 | m Określa, że jeśli ciąg ma znaki nowej linii lub powrotu karetki, operatory ^ i $ będą teraz dopasowywać się do granicy nowej linii, a nie do granicy ciągu. |
3 | o Oblicza wyrażenie tylko raz. |
4 | s Umożliwia korzystanie z. aby dopasować znak nowej linii. |
5 | x Umożliwia użycie spacji w wyrażeniu w celu zwiększenia przejrzystości. |
6 | g Globalnie znajduje wszystkie dopasowania. |
7 | cg Umożliwia kontynuowanie wyszukiwania nawet po niepowodzeniu globalnego dopasowania. |
Dopasowanie tylko raz
Istnieje również prostsza wersja operatora dopasowania -? WZÓR? operator. Jest to w zasadzie identyczne z operatorem m //, z wyjątkiem tego, że pasuje tylko raz w ciągu szukanym między każdym wywołaniem resetowania.
Na przykład możesz użyć tego, aby uzyskać pierwszy i ostatni element listy -
#!/usr/bin/perl
@list = qw/food foosball subeo footnote terfoot canic footbrdige/;
foreach (@list) {
$first = $1 if /(foo.*?)/;
$last = $1 if /(foo.*)/;
}
print "First: $first, Last: $last\n";
Wykonanie powyższego programu daje następujący wynik -
First: foo, Last: footbrdige
Zmienne wyrażeń regularnych
Zmienne wyrażeń regularnych obejmują $, który zawiera ostatnie dopasowane dopasowanie grupujące; $&, który zawiera cały dopasowany ciąg; $`, który zawiera wszystko przed dopasowanym ciągiem; i$', który zawiera wszystko po dopasowanym ciągu. Poniższy kod demonstruje wynik -
#!/usr/bin/perl
$string = "The food is in the salad bar";
$string =~ m/foo/;
print "Before: $`\n";
print "Matched: $&\n";
print "After: $'\n";
Wykonanie powyższego programu daje następujący wynik -
Before: The
Matched: foo
After: d is in the salad bar
Operator podstawienia
Operator podstawiania, s ///, jest tak naprawdę tylko rozszerzeniem operatora dopasowania, które umożliwia zastąpienie dopasowanego tekstu jakimś nowym tekstem. Podstawowa forma operatora to -
s/PATTERN/REPLACEMENT/;
WZÓR to wyrażenie regularne dla szukanego tekstu. REPLACEMENT to specyfikacja tekstu lub wyrażenia regularnego, którego chcemy użyć do zastąpienia znalezionego tekstu. Na przykład możemy zastąpić wszystkie wystąpieniadog z cat używając następującego wyrażenia regularnego -
#/user/bin/perl
$string = "The cat sat on the mat";
$string =~ s/cat/dog/;
print "$string\n";
Wykonanie powyższego programu daje następujący wynik -
The dog sat on the mat
Modyfikatory operatorów substytucji
Oto lista wszystkich modyfikatorów używanych z operatorem podstawienia.
Sr.No. | Modyfikator i opis |
---|---|
1 | i Sprawia, że wielkość liter w dopasowaniu jest niewrażliwa. |
2 | m Określa, że jeśli ciąg ma znaki nowej linii lub powrotu karetki, operatory ^ i $ będą teraz dopasowywać się do granicy nowej linii, a nie do granicy ciągu. |
3 | o Oblicza wyrażenie tylko raz. |
4 | s Umożliwia korzystanie z. aby dopasować znak nowej linii. |
5 | x Umożliwia użycie spacji w wyrażeniu w celu zwiększenia przejrzystości. |
6 | g Zamienia wszystkie wystąpienia znalezionego wyrażenia na tekst zastępczy. |
7 | e Ocenia zamianę tak, jakby była instrukcją Perla i używa jej wartości zwracanej jako tekstu zastępczego. |
Operator tłumaczenia
Tłumaczenie jest podobne, ale nie identyczne, do zasad podstawiania, ale w przeciwieństwie do podstawiania tłumaczenie (lub transliteracja) nie wykorzystuje wyrażeń regularnych do wyszukiwania wartości zastępczych. Operatorami tłumaczenia są -
tr/SEARCHLIST/REPLACEMENTLIST/cds
y/SEARCHLIST/REPLACEMENTLIST/cds
Tłumaczenie zastępuje wszystkie wystąpienia znaków w SEARCHLIST odpowiednimi znakami w REPLACEMENTLIST. Na przykład za pomocą polecenia „Kot siedział na macie”. ciąg, którego używaliśmy w tym rozdziale -
#/user/bin/perl
$string = 'The cat sat on the mat';
$string =~ tr/a/o/;
print "$string\n";
Wykonanie powyższego programu daje następujący wynik -
The cot sot on the mot.
Można również użyć standardowych zakresów Perla, co pozwala określić zakresy znaków według litery lub wartości liczbowej. Aby zmienić wielkość liter w ciągu, możesz użyć następującej składni zamiastuc funkcjonować.
$string =~ tr/a-z/A-Z/;
Modyfikatory operatora tłumaczenia
Poniżej znajduje się lista operatorów związanych z tłumaczeniem.
Sr.No. | Modyfikator i opis |
---|---|
1 | c Uzupełnia SEARCHLIST. |
2 | d Usuwa znalezione, ale niezastąpione znaki. |
3 | s Zgniata zduplikowane zastąpione znaki. |
Modyfikator / d usuwa znaki pasujące do LISTY WYSZUKIWANIA, które nie mają odpowiedniego wpisu w LISTA ZAMIENNIKÓW. Na przykład -
#!/usr/bin/perl
$string = 'the cat sat on the mat.';
$string =~ tr/a-z/b/d;
print "$string\n";
Wykonanie powyższego programu daje następujący wynik -
b b b.
Ostatni modyfikator / s usuwa zduplikowane sekwencje znaków, które zostały zastąpione, więc -
#!/usr/bin/perl
$string = 'food';
$string = 'food';
$string =~ tr/a-z/a-z/s;
print "$string\n";
Wykonanie powyższego programu daje następujący wynik -
fod
Bardziej złożone wyrażenia regularne
Nie musisz tylko dopasowywać się do ustalonych łańcuchów. W rzeczywistości możesz dopasować prawie wszystko, o czym możesz marzyć, używając bardziej złożonych wyrażeń regularnych. Oto krótka ściągawka -
Poniższa tabela zawiera listę składni wyrażeń regularnych, które są dostępne w Pythonie.
Sr.No. | Wzór i opis |
---|---|
1 | ^ Dopasowuje początek wiersza. |
2 | $ Pasuje do końca linii. |
3 | . Dopasowuje dowolny pojedynczy znak z wyjątkiem nowej linii. Użycie opcji m pozwala dopasować również znak nowej linii. |
4 | [...] Dopasowuje dowolny pojedynczy znak w nawiasach. |
5 | [^...] Dopasowuje dowolny pojedynczy znak nie w nawiasach. |
6 | * Dopasowuje 0 lub więcej wystąpień poprzedniego wyrażenia. |
7 | + Dopasowuje 1 lub więcej wystąpień poprzedniego wyrażenia. |
8 | ? Dopasowuje 0 lub 1 wystąpienie poprzedniego wyrażenia. |
9 | { n} Dopasowuje dokładnie n liczbę wystąpień poprzedniego wyrażenia. |
10 | { n,} Dopasowuje n lub więcej wystąpień poprzedniego wyrażenia. |
11 | { n, m} Dopasowuje co najmniej n i co najwyżej m wystąpień poprzedniego wyrażenia. |
12 | a| b Pasuje do a lub b. |
13 | \w Dopasowuje znaki słowne. |
14 | \W Dopasowuje znaki inne niż słowa. |
15 | \s Dopasowuje spacje. Odpowiednik [\ t \ n \ r \ f]. |
16 | \S Dopasowuje bez białych znaków. |
17 | \d Dopasowuje cyfry. Odpowiednik [0-9]. |
18 | \D Dopasowuje niecyfry. |
19 | \A Dopasowuje początek łańcucha. |
20 | \Z Dopasowuje koniec łańcucha. Jeśli istnieje nowa linia, pasuje ona tuż przed nową linią. |
21 | \z Dopasowuje koniec łańcucha. |
22 | \G Mecze to miejsce, w którym zakończył się ostatni mecz. |
23 | \b Dopasowuje granice wyrazów poza nawiasami. Dopasowuje znak Backspace (0x08) wewnątrz nawiasów. |
24 | \B Dopasowuje granice bez słów. |
25 | \n, \t, etc. Dopasowuje znaki nowej linii, powroty karetki, tabulatory itp. |
26 | \1...\9 Pasuje do n-tego zgrupowanego wyrażenia podrzędnego. |
27 | \10 Pasuje do n-tego zgrupowanego wyrażenia podrzędnego, jeśli zostało już dopasowane. W przeciwnym razie odnosi się do ósemkowej reprezentacji kodu znaku. |
28 | [aeiou] Dopasowuje pojedynczy znak w podanym zestawie |
29 | [^aeiou] Dopasowuje pojedynczy znak poza podanym zestawem |
Metaznak ^ pasuje do początku ciągu, a metasymbol $ do końca ciągu. Oto kilka krótkich przykładów.
# nothing in the string (start and end are adjacent)
/^$/
# a three digits, each followed by a whitespace
# character (eg "3 4 5 ")
/(\d\s) {3}/
# matches a string in which every
# odd-numbered letter is a (eg "abacadaf")
/(a.)+/
# string starts with one or more digits
/^\d+/
# string that ends with one or more digits
/\d+$/
Spójrzmy na inny przykład.
#!/usr/bin/perl
$string = "Cats go Catatonic\nWhen given Catnip";
($start) = ($string =~ /\A(.*?) /);
@lines = $string =~ /^(.*?) /gm;
print "First word: $start\n","Line starts: @lines\n";
Wykonanie powyższego programu daje następujący wynik -
First word: Cats
Line starts: Cats When
Dopasowywanie granic
Plik \bdopasowuje na dowolnej granicy słowa, zgodnie z różnicą między klasą \ w a klasą \ W. Ponieważ \ w zawiera znaki słowa, a \ W odwrotnie, zwykle oznacza to zakończenie słowa. Plik\Basercja pasuje do każdej pozycji, która nie jest granicą słowa. Na przykład -
/\bcat\b/ # Matches 'the cat sat' but not 'cat on the mat'
/\Bcat\B/ # Matches 'verification' but not 'the cat on the mat'
/\bcat\B/ # Matches 'catatonic' but not 'polecat'
/\Bcat\b/ # Matches 'polecat' but not 'catatonic'
Wybór alternatyw
| znak jest taki sam, jak standardowy lub bitowy OR w Perlu. Określa alternatywne dopasowania w obrębie wyrażenia regularnego lub grupy. Na przykład, aby dopasować wyrażenie „kot” lub „pies”, możesz użyć tego -
if ($string =~ /cat|dog/)
Możesz grupować poszczególne elementy wyrażenia razem, aby obsługiwać złożone dopasowania. Wyszukiwanie nazwisk dwóch osób można przeprowadzić za pomocą dwóch oddzielnych testów, takich jak ten -
if (($string =~ /Martin Brown/) || ($string =~ /Sharon Brown/))
This could be written as follows
if ($string =~ /(Martin|Sharon) Brown/)
Dopasowywanie grupowe
Z punktu widzenia wyrażeń regularnych nie ma różnicy między nimi, chyba że to pierwsze jest nieco jaśniejsze.
$string =~ /(\S+)\s+(\S+)/;
and
$string =~ /\S+\s+\S+/;
Jednak zaletą grupowania jest to, że pozwala nam wyodrębnić sekwencję z wyrażenia regularnego. Grupy są zwracane jako lista w kolejności, w jakiej występują w oryginale. Na przykład w poniższym fragmencie wyciągnęliśmy godziny, minuty i sekundy z łańcucha.
my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);
Oprócz tej bezpośredniej metody, dopasowane grupy są również dostępne w ramach specjalnych zmiennych $ x, gdzie x jest numerem grupy w wyrażeniu regularnym. Moglibyśmy zatem przepisać poprzedni przykład w następujący sposób -
#!/usr/bin/perl
$time = "12:05:30";
$time =~ m/(\d+):(\d+):(\d+)/;
my ($hours, $minutes, $seconds) = ($1, $2, $3);
print "Hours : $hours, Minutes: $minutes, Second: $seconds\n";
Wykonanie powyższego programu daje następujący wynik -
Hours : 12, Minutes: 05, Second: 30
Gdy grupy są używane w wyrażeniach podstawiania, w tekście zastępczym można użyć składni $ x. W ten sposób możemy ponownie sformatować ciąg daty, używając tego -
#!/usr/bin/perl
$date = '03/26/1999';
$date =~ s#(\d+)/(\d+)/(\d+)#$3/$1/$2#;
print "$date\n";
Wykonanie powyższego programu daje następujący wynik -
1999/03/26
Asercja \ G
Asercja \ G umożliwia kontynuowanie wyszukiwania od miejsca, w którym wystąpiło ostatnie dopasowanie. Na przykład w poniższym kodzie użyliśmy \ G, abyśmy mogli wyszukać właściwą pozycję, a następnie wyodrębnić niektóre informacje, bez konieczności tworzenia bardziej złożonego, pojedynczego wyrażenia regularnego -
#!/usr/bin/perl
$string = "The time is: 12:31:02 on 4/12/00";
$string =~ /:\s+/g;
($time) = ($string =~ /\G(\d+:\d+:\d+)/);
$string =~ /.+\s+/g;
($date) = ($string =~ m{\G(\d+/\d+/\d+)});
print "Time: $time, Date: $date\n";
Wykonanie powyższego programu daje następujący wynik -
Time: 12:31:02, Date: 4/12/00
Asercja \ G jest właściwie metasymbolowym odpowiednikiem funkcji pos, więc między wywołaniami wyrażeń regularnych można nadal używać pos, a nawet modyfikować wartość pos (a tym samym \ G), używając pos jako podprogramu lvalue.
Przykłady wyrażeń regularnych
Znaki dosłowne
Sr.No. | Przykład i opis |
---|---|
1 | Perl Dopasuj „Perl”. |
Klasy postaci
Sr.No. | Przykład i opis |
---|---|
1 | [Pp]ython Pasuje do „Python” lub „python” |
2 | rub[ye] Dopasowuje „ruby” lub „rube” |
3 | [aeiou] Dopasowuje dowolną małą samogłoskę |
4 | [0-9] Dopasowuje dowolną cyfrę; tak samo jak [0123456789] |
5 | [a-z] Dopasowuje każdą małą literę ASCII |
6 | [A-Z] Dopasowuje dowolną wielką literę ASCII |
7 | [a-zA-Z0-9] Pasuje do dowolnego z powyższych |
8 | [^aeiou] Dopasowuje wszystko inne niż mała samogłoska |
9 | [^0-9] Dopasowuje wszystko inne niż cyfra |
Specjalne klasy postaci
Sr.No. | Przykład i opis |
---|---|
1 | . Dopasowuje dowolny znak z wyjątkiem nowej linii |
2 | \d Dopasowuje cyfrę: [0–9] |
3 | \D Odpowiada cyfrze: [^ 0-9] |
4 | \s Dopasowuje biały znak: [\ t \ r \ n \ f] |
5 | \S Dopasowuje bez białych znaków: [^ \ t \ r \ n \ f] |
6 | \w Dopasowuje pojedynczy znak słowa: [A-Za-z0-9_] |
7 | \W Dopasowuje znak niebędący słowem: [^ A-Za-z0-9_] |
Przypadki powtórzeń
Sr.No. | Przykład i opis |
---|---|
1 | ruby? Dopasowuje „rub” lub „ruby”: y jest opcjonalne |
2 | ruby* Dopasowuje „rub” plus 0 lub więcej lat |
3 | ruby+ Dopasowuje „rub” plus 1 lub więcej lat |
4 | \d{3} Dopasowuje dokładnie 3 cyfry |
5 | \d{3,} Dopasowuje 3 lub więcej cyfr |
6. | \d{3,5} Dopasowuje 3, 4 lub 5 cyfr |
Nongreedy Repetition
To pasuje do najmniejszej liczby powtórzeń -
Sr.No. | Przykład i opis |
---|---|
1 | <.*> Chciwe powtórzenie: dopasowuje „<python> perl>” |
2 | <.*?> Nongreedy: dopasowuje „<python>” do „<python> perl>” |
Grupowanie z nawiasami
Sr.No. | Przykład i opis |
---|---|
1 | \D\d+ Brak grupy: + powtarza \ d |
2 | (\D\d)+ Zgrupowane: + powtórzenia \ D \ d para |
3 | ([Pp]ython(, )?)+ Dopasuj „Python”, „Python, python, python” itp. |
Backreferences
To ponownie pasuje do poprzednio dopasowanej grupy -
Sr.No. | Przykład i opis |
---|---|
1 | ([Pp])ython&\1ails Pasuje do Python & Pails lub Python & Pails |
2 | (['"])[^\1]*\1 Ciąg w pojedynczym lub podwójnym cudzysłowie. \ 1 pasuje do dopasowanej pierwszej grupy. \ 2 pasuje do dopasowanej 2. grupy itp. |
Alternatywy
Sr.No. | Przykład i opis |
---|---|
1 | python|perl Pasuje do „python” lub „perl” |
2 | rub(y|le)) Dopasowuje „rubin” lub „rubel” |
3 | Python(!+|\?) „Python”, po którym następuje jeden lub więcej! czy jeden? |
Kotwice
Ta potrzeba określenia pozycji dopasowania.
Sr.No. | Przykład i opis |
---|---|
1 | ^Python Dopasowuje „Python” na początku łańcucha lub linii wewnętrznej |
2 | Python$ Dopasowuje „Python” na końcu ciągu lub linii |
3 | \APython Dopasowuje „Python” na początku łańcucha |
4 | Python\Z Dopasowuje „Python” na końcu ciągu |
5 | \bPython\b Dopasowuje „Python” na granicy słowa |
6 | \brub\B \ B nie jest granicą słów: dopasuj „rub” w „rube” i „ruby”, ale nie samodzielnie |
7 | Python(?=!) Odpowiada wyrażeniu „Python”, jeśli następuje po nim wykrzyknik |
8 | Python(?!!) Dopasowuje „Python”, jeśli nie następuje po nim wykrzyknik |
Specjalna składnia z nawiasami
Sr.No. | Przykład i opis |
---|---|
1 | R(?#comment) Pasuje do „R”. Cała reszta to komentarz |
2 | R(?i)uby Podczas dopasowywania „uby” bez rozróżniania wielkości liter |
3 | R(?i:uby) Tak samo jak powyżej |
4 | rub(?:y|le)) Grupuj tylko bez tworzenia \ 1 odwołania wstecznego |