Perl - Ekspresi Reguler

Ekspresi reguler adalah rangkaian karakter yang menentukan pola atau pola yang Anda lihat. Sintaks ekspresi reguler di Perl sangat mirip dengan apa yang akan Anda temukan dalam program pendukung ekspresi reguler lainnya, sepertised, grep, dan awk.

Metode dasar untuk menerapkan ekspresi reguler adalah dengan menggunakan operator pengikat pola = ~ dan !~. Operator pertama adalah operator tes dan penugasan.

Ada tiga operator ekspresi reguler dalam Perl.

  • Cocokkan Ekspresi Reguler - m //
  • Ganti Ekspresi Reguler - s ///
  • Menerjemahkan Ekspresi Reguler - tr ///

Garis miring di setiap kasus bertindak sebagai pembatas untuk ekspresi reguler (regex) yang Anda tentukan. Jika Anda merasa nyaman dengan pembatas lain, maka Anda dapat menggunakan garis miring sebagai pengganti.

Operator Pertandingan

Operator pencocokan, m //, digunakan untuk mencocokkan string atau pernyataan dengan ekspresi reguler. Misalnya, untuk mencocokkan urutan karakter "foo" dengan skalar $ bar, Anda dapat menggunakan pernyataan seperti ini -

#!/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";
}

Ketika program di atas dijalankan, itu menghasilkan hasil sebagai berikut -

First time is matching
Second time is matching

M // sebenarnya bekerja dengan cara yang sama seperti rangkaian operator q //. Anda dapat menggunakan kombinasi karakter yang cocok secara alami untuk bertindak sebagai pembatas ekspresi. Misalnya, m {}, m (), dan m> <semuanya valid. Jadi contoh di atas dapat ditulis ulang sebagai berikut -

#!/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";
}

Anda dapat menghilangkan m dari m // jika pembatasnya adalah garis miring ke depan, tetapi untuk semua pembatas lainnya Anda harus menggunakan awalan m.

Perhatikan bahwa seluruh ekspresi pencocokan, yaitu ekspresi di sebelah kiri = ~ atau! ~ Dan operator pencocokan, mengembalikan nilai benar (dalam konteks skalar) jika ekspresi cocok. Oleh karena itu pernyataan -

$true = ($foo =~ m/foo/);

akan menyetel $ true ke 1 jika $ foo cocok dengan regex, atau 0 jika kecocokan gagal. Dalam konteks daftar, kecocokan mengembalikan konten ekspresi yang dikelompokkan. Misalnya, saat mengekstrak jam, menit, dan detik dari string waktu, kita dapat menggunakan -

my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);

Pengubah Operator Pertandingan

Operator pertandingan mendukung kumpulan pengubahnya sendiri. Pengubah / g memungkinkan pencocokan global. Pengubah / i akan membuat kasus tidak peka huruf besar / kecil. Berikut adalah daftar lengkap modifikator

Sr.No. Pengubah & Deskripsi
1

i

Membuat kasus tidak peka huruf besar / kecil.

2

m

Menentukan bahwa jika string memiliki karakter baris baru atau karakter balik, operator ^ dan $ sekarang akan cocok dengan batas baris baru, bukan batas string.

3

o

Mengevaluasi ekspresi hanya sekali.

4

s

Memungkinkan penggunaan. untuk mencocokkan karakter baris baru.

5

x

Memungkinkan Anda menggunakan spasi putih dalam ekspresi untuk kejelasan.

6

g

Secara global menemukan semua kecocokan.

7

cg

Memungkinkan pencarian untuk melanjutkan bahkan setelah pertandingan global gagal.

Mencocokkan Hanya Sekali

Ada juga versi yang lebih sederhana dari operator pertandingan -? POLA? operator. Ini pada dasarnya identik dengan m // operator kecuali bahwa itu hanya cocok sekali dalam string yang Anda cari di antara setiap panggilan untuk disetel ulang.

Misalnya, Anda dapat menggunakan ini untuk mendapatkan elemen pertama dan terakhir dalam daftar -

#!/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";

Ketika program di atas dijalankan, itu menghasilkan hasil sebagai berikut -

First: foo, Last: footbrdige

Variabel Ekspresi Reguler

Variabel ekspresi reguler termasuk $, yang berisi apa pun yang cocok dengan pengelompokan terakhir; $&, yang berisi seluruh string yang cocok; $`, yang berisi semua sebelum string yang cocok; dan$', yang berisi semuanya setelah string yang cocok. Kode berikut menunjukkan hasilnya -

#!/usr/bin/perl

$string = "The food is in the salad bar";
$string =~ m/foo/;
print "Before: $`\n";
print "Matched: $&\n";
print "After: $'\n";

Ketika program di atas dijalankan, itu menghasilkan hasil sebagai berikut -

Before: The
Matched: foo
After: d is in the salad bar

Operator Pergantian

Operator substitusi, s ///, sebenarnya hanyalah perpanjangan dari operator pencocokan yang memungkinkan Anda mengganti teks yang cocok dengan beberapa teks baru. Bentuk dasar operator adalah -

s/PATTERN/REPLACEMENT/;

POLA adalah ekspresi reguler untuk teks yang kita cari. REPLACEMENT adalah spesifikasi untuk teks atau ekspresi reguler yang ingin kita gunakan untuk mengganti teks yang ditemukan. Misalnya, kita dapat mengganti semua kemunculandog dengan cat menggunakan ekspresi reguler berikut -

#/user/bin/perl

$string = "The cat sat on the mat";
$string =~ s/cat/dog/;

print "$string\n";

Ketika program di atas dijalankan, itu menghasilkan hasil sebagai berikut -

The dog sat on the mat

Pengubah Operator Substitusi

Berikut adalah daftar semua pengubah yang digunakan dengan operator substitusi.

Sr.No. Pengubah & Deskripsi
1

i

Membuat kasus tidak peka huruf besar / kecil.

2

m

Menentukan bahwa jika string memiliki karakter baris baru atau karakter balik, operator ^ dan $ sekarang akan cocok dengan batas baris baru, bukan batas string.

3

o

Mengevaluasi ekspresi hanya sekali.

4

s

Memungkinkan penggunaan. untuk mencocokkan karakter baris baru.

5

x

Memungkinkan Anda menggunakan spasi putih dalam ekspresi untuk kejelasan.

6

g

Mengganti semua kemunculan ekspresi yang ditemukan dengan teks pengganti.

7

e

Mengevaluasi penggantian seolah-olah itu adalah pernyataan Perl, dan menggunakan nilai kembaliannya sebagai teks pengganti.

Operator Terjemahan

Terjemahan mirip, tetapi tidak identik, dengan prinsip substitusi, tetapi tidak seperti substitusi, terjemahan (atau transliterasi) tidak menggunakan ekspresi reguler untuk pencariannya pada nilai pengganti. Operator terjemahan adalah -

tr/SEARCHLIST/REPLACEMENTLIST/cds
y/SEARCHLIST/REPLACEMENTLIST/cds

Terjemahan menggantikan semua kemunculan karakter di SEARCHLIST dengan karakter yang sesuai di REPLACEMENTLIST. Misalnya, menggunakan "Kucing duduk di atas tikar". string yang telah kami gunakan dalam bab ini -

#/user/bin/perl

$string = 'The cat sat on the mat';
$string =~ tr/a/o/;

print "$string\n";

Ketika program di atas dijalankan, itu menghasilkan hasil sebagai berikut -

The cot sot on the mot.

Rentang Perl standar juga dapat digunakan, memungkinkan Anda untuk menentukan rentang karakter baik berdasarkan huruf atau nilai numerik. Untuk mengubah kasus string, Anda mungkin menggunakan sintaks berikut sebagai penggantiuc fungsi.

$string =~ tr/a-z/A-Z/;

Pengubah Operator Terjemahan

Berikut adalah daftar operator yang terkait dengan terjemahan.

Sr.No. Pengubah & Deskripsi
1

c

Melengkapi SEARCHLIST.

2

d

Penghapusan ditemukan tetapi karakter tidak diganti.

3

s

Squash duplikat karakter yang diganti.

Pengubah / d menghapus karakter yang cocok dengan SEARCHLIST yang tidak memiliki entri terkait di REPLACEMENTLIST. Misalnya -

#!/usr/bin/perl 

$string = 'the cat sat on the mat.';
$string =~ tr/a-z/b/d;

print "$string\n";

Ketika program di atas dijalankan, itu menghasilkan hasil sebagai berikut -

b b   b.

Pengubah terakhir, / s, menghapus urutan karakter duplikat yang diganti, jadi -

#!/usr/bin/perl

$string = 'food';
$string = 'food';
$string =~ tr/a-z/a-z/s;

print "$string\n";

Ketika program di atas dijalankan, itu menghasilkan hasil sebagai berikut -

fod

Ekspresi Reguler yang Lebih Kompleks

Anda tidak hanya harus mencocokkan pada string tetap. Bahkan, Anda dapat mencocokkan apa saja yang Anda impikan dengan menggunakan ekspresi reguler yang lebih kompleks. Berikut lembar contekan singkat -

Tabel berikut mencantumkan sintaks ekspresi reguler yang tersedia di Python.

Sr.No. Pola & Deskripsi
1

^

Cocok di awal baris.

2

$

Pertandingan akhir baris.

3

.

Cocok dengan salah satu karakter kecuali baris baru. Menggunakan opsi m memungkinkannya untuk mencocokkan baris baru juga.

4

[...]

Mencocokkan salah satu karakter dalam tanda kurung.

5

[^...]

Cocok dengan satu karakter apa pun yang tidak ada dalam tanda kurung.

6

*

Cocok dengan 0 atau lebih kemunculan ekspresi sebelumnya.

7

+

Cocok dengan 1 atau lebih kemunculan ekspresi sebelumnya.

8

?

Cocok dengan 0 atau 1 kemunculan ekspresi sebelumnya.

9

{ n}

Cocok persis dengan n jumlah kemunculan ekspresi sebelumnya.

10

{ n,}

Cocok dengan n atau lebih kemunculan ekspresi sebelumnya.

11

{ n, m}

Cocok setidaknya n dan paling banyak m kemunculan ekspresi sebelumnya.

12

a| b

Cocok dengan a atau b.

13

\w

Cocok dengan karakter kata.

14

\W

Cocok dengan karakter bukan kata.

15

\s

Cocok dengan spasi. Setara dengan [\ t \ n \ r \ f].

16

\S

Cocok dengan nonwhitespace.

17

\d

Cocok dengan angka. Setara dengan [0-9].

18

\D

Cocok dengan nondigits.

19

\A

Cocok dengan awal string.

20

\Z

Cocok dengan ujung string. Jika ada baris baru, itu cocok sebelum baris baru.

21

\z

Cocok dengan ujung string.

22

\G

Mencocokkan poin di mana pertandingan terakhir selesai.

23

\b

Mencocokkan batas kata saat berada di luar tanda kurung. Cocok dengan spasi mundur (0x08) saat berada di dalam tanda kurung.

24

\B

Cocok dengan batasan bukan kata.

25

\n, \t, etc.

Cocok dengan baris baru, carriage return, tab, dll.

26

\1...\9

Cocok dengan subekspresi yang dikelompokkan ke-n.

27

\10

Cocok dengan subekspresi yang dikelompokkan ke-n jika sudah cocok. Jika tidak mengacu pada representasi oktal dari kode karakter.

28

[aeiou]

Cocok dengan satu karakter dalam set yang diberikan

29

[^aeiou]

Cocok dengan satu karakter di luar himpunan yang diberikan

^ Metacharacter cocok dengan awal string dan $ metasymbol cocok dengan akhir string. Berikut beberapa contoh singkatnya.

# 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+$/

Mari kita lihat contoh lainnya.

#!/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";

Ketika program di atas dijalankan, itu menghasilkan hasil sebagai berikut -

First word: Cats
Line starts: Cats When

Mencocokkan Batas

Itu \bcocok di setiap batas kata, seperti yang didefinisikan oleh perbedaan antara kelas \ w dan kelas \ W. Karena \ w menyertakan karakter untuk sebuah kata, dan \ W sebaliknya, ini biasanya berarti penghentian sebuah kata. Itu\Bassertion cocok dengan posisi apa pun yang bukan merupakan batas kata. Misalnya -

/\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'

Memilih Alternatif

The | karakter seperti standar atau bitwise ATAU dalam Perl. Ini menentukan kecocokan alternatif dalam ekspresi reguler atau grup. Misalnya, untuk mencocokkan "kucing" atau "anjing" dalam sebuah ekspresi, Anda dapat menggunakan ini -

if ($string =~ /cat|dog/)

Anda dapat mengelompokkan masing-masing elemen ekspresi untuk mendukung pencocokan kompleks. Mencari nama dua orang dapat dilakukan dengan dua tes terpisah, seperti ini -

if (($string =~ /Martin Brown/) ||  ($string =~ /Sharon Brown/))

This could be written as follows

if ($string =~ /(Martin|Sharon) Brown/)

Pengelompokan Pencocokan

Dari sudut pandang ekspresi reguler, tidak ada perbedaan antara kecuali, mungkin, yang pertama sedikit lebih jelas.

$string =~ /(\S+)\s+(\S+)/;

and 

$string =~ /\S+\s+\S+/;

Namun, manfaat pengelompokan adalah memungkinkan kita mengekstrak urutan dari ekspresi reguler. Pengelompokan dikembalikan sebagai daftar dalam urutan kemunculannya di aslinya. Misalnya, dalam fragmen berikut kami telah menarik jam, menit, dan detik dari sebuah string.

my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);

Selain metode langsung ini, grup yang cocok juga tersedia dalam variabel $ x khusus, di mana x adalah jumlah grup dalam ekspresi reguler. Oleh karena itu, kita dapat menulis ulang contoh sebelumnya sebagai berikut -

#!/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";

Ketika program di atas dijalankan, itu menghasilkan hasil sebagai berikut -

Hours : 12, Minutes: 05, Second: 30

Ketika grup digunakan dalam ekspresi substitusi, sintaks $ x dapat digunakan dalam teks pengganti. Jadi, kita dapat memformat ulang string tanggal menggunakan ini -

#!/usr/bin/perl

$date = '03/26/1999';
$date =~ s#(\d+)/(\d+)/(\d+)#$3/$1/$2#;

print "$date\n";

Ketika program di atas dijalankan, itu menghasilkan hasil sebagai berikut -

1999/03/26

Pernyataan \ G

Pernyataan \ G memungkinkan Anda untuk melanjutkan pencarian dari titik di mana pertandingan terakhir terjadi. Misalnya, dalam kode berikut, kami telah menggunakan \ G sehingga kami dapat mencari ke posisi yang benar dan kemudian mengekstrak beberapa informasi, tanpa harus membuat ekspresi reguler tunggal yang lebih kompleks -

#!/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";

Ketika program di atas dijalankan, itu menghasilkan hasil sebagai berikut -

Time: 12:31:02, Date: 4/12/00

Pernyataan \ G sebenarnya hanyalah metasymbol yang setara dengan fungsi pos, jadi di antara panggilan ekspresi reguler Anda dapat terus menggunakan pos, dan bahkan mengubah nilai pos (dan karena itu \ G) dengan menggunakan pos sebagai subrutin lvalue.

Contoh Ekspresi Reguler

Karakter Literal

Sr.No. Contoh & Deskripsi
1

Perl

Cocokkan "Perl".

Kelas Karakter

Sr.No. Contoh & Deskripsi
1

[Pp]ython

Cocok dengan "Python" atau "python"

2

rub[ye]

Cocok dengan "ruby" atau "rube"

3

[aeiou]

Cocok dengan salah satu vokal huruf kecil

4

[0-9]

Cocok dengan angka apa pun; sama seperti [0123456789]

5

[a-z]

Cocok dengan semua huruf kecil ASCII

6

[A-Z]

Cocok dengan semua huruf ASCII huruf besar

7

[a-zA-Z0-9]

Cocok dengan salah satu dari yang di atas

8

[^aeiou]

Cocok dengan apa pun selain vokal huruf kecil

9

[^0-9]

Mencocokkan apa pun selain digit

Kelas Karakter Khusus

Sr.No. Contoh & Deskripsi
1

.

Cocok dengan semua karakter kecuali baris baru

2

\d

Cocok dengan angka: [0-9]

3

\D

Cocok dengan angka: [^ 0-9]

4

\s

Cocok dengan karakter spasi: [\ t \ r \ n \ f]

5

\S

Cocok dengan bukan spasi: [^ \ t \ r \ n \ f]

6

\w

Cocok dengan satu karakter kata: [A-Za-z0-9_]

7

\W

Cocok dengan karakter bukan kata: [^ A-Za-z0-9_]

Kasus Pengulangan

Sr.No. Contoh & Deskripsi
1

ruby?

Cocok dengan "gosok" atau "ruby": y adalah opsional

2

ruby*

Cocok dengan "gosok" ditambah 0 atau lebih ys

3

ruby+

Cocok "gosok" ditambah 1 atau lebih ys

4

\d{3}

Cocok persis dengan 3 digit

5

\d{3,}

Cocok dengan 3 digit atau lebih

6.

\d{3,5}

Cocok dengan 3, 4, atau 5 digit

Pengulangan Nongreedy

Ini cocok dengan jumlah pengulangan terkecil -

Sr.No. Contoh & Deskripsi
1

<.*>

Pengulangan serakah: cocok dengan "<python> perl>"

2

<.*?>

Nongreedy: mencocokkan "<python>" dengan "<python> perl>"

Pengelompokan dengan Tanda Kurung

Sr.No. Contoh & Deskripsi
1

\D\d+

Tidak ada grup: + berulang \ d

2

(\D\d)+

Dikelompokkan: + mengulangi \ D \ d pasangan

3

([Pp]ython(, )?)+

Cocokkan "Python", "Python, python, python", dll.

Referensi latar

Ini cocok dengan grup yang sebelumnya cocok lagi -

Sr.No. Contoh & Deskripsi
1

([Pp])ython&\1ails

Cocok dengan python & pails atau Python & Pails

2

(['"])[^\1]*\1

String kutip tunggal atau ganda. \ 1 cocok dengan apa pun yang cocok dengan grup pertama. \ 2 cocok dengan apa pun yang cocok dengan grup ke-2, dll.

Alternatif

Sr.No. Contoh & Deskripsi
1

python|perl

Cocok dengan "python" atau "perl"

2

rub(y|le))

Cocok dengan "ruby" atau "ruble"

3

Python(!+|\?)

"Python" diikuti oleh satu atau lebih! atau satu?

Jangkar

Ini perlu menentukan posisi pertandingan.

Sr.No. Contoh & Deskripsi
1

^Python

Cocok dengan "Python" di awal string atau baris internal

2

Python$

Cocok dengan "Python" di akhir string atau baris

3

\APython

Cocok dengan "Python" di awal string

4

Python\Z

Cocok dengan "Python" di akhir string

5

\bPython\b

Cocok dengan "Python" di batas kata

6

\brub\B

\ B adalah batas bukan kata: cocokkan "gosok" dalam "rube" dan "ruby" tetapi tidak sendirian

7

Python(?=!)

Cocok dengan "Python", jika diikuti dengan tanda seru

8

Python(?!!)

Cocok dengan "Python", jika tidak diikuti dengan tanda seru

Sintaks Khusus dengan Tanda Kurung

Sr.No. Contoh & Deskripsi
1

R(?#comment)

Cocok dengan "R". Sisanya adalah komentar

2

R(?i)uby

Tidak peka huruf besar / kecil saat mencocokkan "uby"

3

R(?i:uby)

Sama seperti di atas

4

rub(?:y|le))

Kelompokkan hanya tanpa membuat \ 1 referensi latar