Ekspresi reguler dalam JavaScript. objek RegExp

Kelas RegExp dalam JavaScript adalah ekspresi reguler - objek yang menjelaskan pola karakter. Objek RegExp biasanya dibuat menggunakan sintaks literal khusus di bawah ini, tetapi objek tersebut juga dapat dibuat menggunakan konstruktor RegExp ().

Sintaksis

// menggunakan sintaks literal khusus var regex = / pola / bendera; // menggunakan konstruktor var regex = new RegExp("pola", "bendera"); var regex = RegExp baru (/ pola /, "bendera");

Nilai parameter:

Bendera Ekspresi Reguler

BenderaKeterangan
GMemungkinkan Anda menemukan semua kecocokan, daripada berhenti setelah kecocokan pertama ( bendera pertandingan global).
SayaMengizinkan pencocokan peka huruf besar-kecil ( abaikan bendera kasus).
MPencocokan dilakukan di beberapa baris. Karakter awal dan akhir (^ dan $) diproses pada beberapa baris, yaitu pencocokan terjadi di awal atau akhir setiap baris (pembatas \ n atau \ r), dan bukan hanya di awal atau akhir seluruh baris ( bendera multiline).
kamuPola akan ditafsirkan sebagai urutan titik kode Unicode ( bendera unicode).
kamuPencocokan terjadi oleh indeks yang ditunjukkan oleh properti lastIndex dari ekspresi reguler ini, sedangkan pencocokan tidak dilakukan pada indeks yang lebih baru atau lebih awal ( bendera lengket).

Set karakter

Metakarakter

SimbolKeterangan
. Menemukan satu karakter selain karakter garis baru, atau karakter akhir baris (\ n, \ r, \ u2028 atau \ u2029).
\ DMenemukan karakter angka dalam alfabet Latin dasar. Setara dengan menggunakan set karakter.
\ DMenemukan karakter apa pun yang bukan merupakan angka dalam alfabet Latin dasar. Setara dengan set karakter [^ 0-9].
\ SMenemukan satu karakter spasi putih. Spasi mengacu pada spasi, tab, feed halaman, feed baris, dan karakter spasi putih Unicode lainnya. Setara dengan karakter set [\ f \ n \ r \ t \ v \ u00a0 \ u1680 \ u180e \ u2000 \ u2001 \ u2002 \ u2003 \ u2004 \ u2005 \ u2006 \ u2007 \ u2008 \ u2009 \ u200a \ u2028 \u202f \ u205f \ u3000].
\ SMenemukan satu karakter yang bukan spasi. Spasi mengacu pada spasi, tab, feed halaman, feed baris, dan karakter spasi putih Unicode lainnya. Setara dengan set karakter [^ \ f \ n \ r \ t \ v \ u00a0 \ u1680 \ u180e \ u2000 \ u2001 \ u2002 \ u2003 \ u2004 \ u2005 \ u2006 \ u2007 \ u2008 \ u2009 \ u200a \ U2028 \u20u2029 \ u205f \ u3000].
[\ B]Menemukan karakter spasi mundur (karakter khusus \ b, U + 0008).
\0 Menemukan karakter 0 (nol).
\ nMenemukan karakter baris baru.
\ FMenemukan karakter feed halaman.
\ RMenemukan karakter carriage return.
\ TMenemukan karakter tab horizontal.
\ vMenemukan karakter tab vertikal.
\ wMenemukan karakter alfanumerik apa pun dalam alfabet Latin dasar, termasuk garis bawah. Setara dengan set karakter.
\ WMenemukan karakter apa pun yang bukan karakter alfabet Latin dasar. Setara dengan set karakter [^ a-Za-z0-9_].
\ cXMenemukan karakter kontrol dalam string. Dimana X adalah huruf dari A sampai Z. Misalnya /\cM/ adalah singkatan dari karakter Ctrl-M.
\ xhhMenemukan karakter menggunakan nilai heksadesimal (hh adalah nilai heksadesimal dua digit).
\ uhhhhMenemukan karakter menggunakan pengkodean UTF-16 (hhhh adalah nilai heksadesimal empat digit).
\ u (hhhh) atau
\u (hhhhh)
Menemukan karakter dengan nilai Unicode U + hhhh atau U + hhhhh (nilai heksadesimal). Hanya ketika bendera u diberikan.
\ Menunjukkan bahwa karakter berikutnya adalah khusus dan tidak boleh ditafsirkan secara harfiah. Untuk karakter yang biasanya diperlakukan secara khusus, menunjukkan bahwa karakter selanjutnya tidak istimewa dan harus ditafsirkan secara harfiah.

Pembatasan

Kuantifier

SimbolKeterangan
n *Pencocokan terjadi pada string apa pun yang berisi nol atau lebih kemunculan karakter n.
n +Pencocokan terjadi dengan string apa pun yang mengandung setidaknya satu karakter n.
n?Pencocokan terjadi pada setiap baris sebelum elemen n nol atau satu kali.
n (x)Cocok dengan string apa pun yang berisi urutan karakter n beberapa kali x. x
n (x,) x kemunculan elemen sebelumnya n. x harus bilangan bulat positif.
n (x, y)Cocok dengan baris mana pun yang mengandung setidaknya x, tapi tidak lebih dari dengan kamu kemunculan elemen sebelumnya n. x dan kamu harus bilangan bulat positif.
n *?
n +?
n ??
n(x)?
n(x,)?
n (x, y)?
Pencocokan terjadi dengan analogi dengan quantifiers *, +,? dan (...), namun, pencarian dilakukan dengan kecocokan sekecil mungkin. Defaultnya adalah mode serakah,? di akhir quantifier memungkinkan Anda untuk menentukan mode "tidak serakah" di mana pencocokan diulang sesedikit mungkin.
x (? = y)Memungkinkan Anda untuk mencocokkan x, hanya jika untuk x Sebaiknya kamu.
x (?! y)Memungkinkan Anda untuk mencocokkan x, hanya jika untuk x itu tidak mengikuti kamu.
x | yPencocokan terjadi dengan salah satu alternatif yang ditentukan.

Pengelompokan dan tautan balik

SimbolKeterangan
(x)Menemukan simbol x dan ingat hasil pertandingan ("menangkap tanda kurung"). Substring yang cocok dapat dipanggil dari elemen array yang dihasilkan ..., [n], atau dari properti objek RegExp $ 1 ..., $ 9 yang telah ditentukan.
(?: x)Menemukan simbol x, tetapi tidak ingat hasil kecocokan ("tanda kurung tidak menangkap"). Substring yang cocok tidak dapat dipanggil dari elemen larik yang dihasilkan ..., [n], atau dari properti objek RegExp $1 ..., $9 yang telah ditentukan sebelumnya.
\ nReferensi kembali ke substring terakhir yang cocok dengan substring ke-n dalam tanda kurung dalam ekspresi reguler (tanda kurung diberi nomor dari kiri ke kanan). n harus bilangan bulat positif.

Artikel ini telah membahas dasar-dasar penggunaan ekspresi reguler dalam Javascript.

pengantar

Apa itu ekspresi reguler?

Regex JS adalah urutan karakter yang membentuk aturan pencarian. Aturan ini kemudian dapat digunakan untuk mencari teks serta menggantinya. Dalam praktiknya, ekspresi reguler bahkan dapat terdiri dari satu karakter, tetapi pola pencarian yang lebih kompleks lebih umum.

Dalam Javascript, ekspresi reguler juga merupakan objek. Ini adalah pola yang digunakan untuk mencocokkan urutan karakter dalam string. Mereka digunakan dalam metode exec() dan test() dari objek RegExp, serta dalam metode match(), replace(), search, dan split() dari objek String.

Contoh

pola var = / contoh / i

/ contoh / i adalah ekspresi reguler. contoh adalah pola ( yang akan digunakan dalam pencarian). i adalah pengubah yang menunjukkan sensitivitas huruf besar/kecil.

Mempersiapkan ekspresi reguler

Ekspresi reguler JS terdiri dari pola dan pengubah. Sintaksnya akan menjadi seperti ini:

/ pola / pengubah;

Template mendefinisikan aturan pencarian. Ini terdiri dari karakter sederhana seperti / abc / atau kombinasi dari sederhana dan karakter spesial: / abc / atau / Bab (d +).d /.

tabel template

Pengubah memungkinkan kueri peka huruf besar-kecil, global, dan sebagainya. Mereka digunakan untuk melakukan pencarian peka huruf besar-kecil serta pencarian global.

Tabel pengubah

Kami sekarang siap untuk menerapkan ekspresi reguler JS. Ada dua cara utama untuk melakukan ini: menggunakan objek regex atau regex untuk string.

Menggunakan objek regex

Buat objek ekspresi reguler

Objek ini menggambarkan pola karakter. Ini digunakan untuk pencocokan pola. Ada dua cara untuk membangun objek ekspresi reguler.

Metode 1: menggunakan literal regex yang terdiri dari pola yang diapit garis miring, misalnya:

var reg = / ab + c /;

Literal ekspresi reguler memicu pra-kompilasi ekspresi reguler saat skrip diuraikan. Jika ekspresi reguler persisten, gunakan untuk meningkatkan kinerja.

Metode 2: dengan memanggil fungsi konstruktor dari objek RegExp, misalnya:

var reg = RegExp baru ("ab + c");

Menggunakan konstruktor memungkinkan Anda untuk mengkompilasi ekspresi reguler JS saat runtime. Gunakan metode ini jika ekspresi reguler akan berubah atau Anda tidak mengetahui polanya sebelumnya. Misalnya, jika Anda menerima informasi dari pengguna yang memasukkan istilah pencarian.

Metode Objek Ekspresi Reguler

Mari kita lihat beberapa metode umum dari objek ekspresi reguler:

  • menyusun () ( usang dalam versi 1.5) - mengkompilasi ekspresi reguler;
  • exec() - Melakukan pencocokan pada string. Mengembalikan pertandingan pertama;
  • test() - Melakukan pencocokan pada string. Mengembalikan nilai benar atau salah;
  • toString () - Mengembalikan nilai string dari ekspresi reguler.

Contoh dari

Menggunakan tes ()

Metode test () adalah ekspresi reguler dari objek RegExp. Itu mencari string templat, dan tergantung pada hasil yang dikembalikannya, itu mengembalikan benar atau salah. Contoh ekspresi reguler JS berikut menunjukkan cara mencari dalam string untuk karakter “ e”:

var patt = / e /; patt.test ("Hal-hal terbaik di dunia gratis!");

Karena di sini baris berisi “ e”, Hasil dari kode ini akan benar.

Anda tidak perlu menempatkan ekspresi reguler dalam variabel sama sekali. Kueri yang sama dapat dibuat dalam satu baris:

/e/.test("Hal-hal terbaik di dunia gratis! ");

Menggunakan exec()

Ini mencari string untuk aturan pencarian yang ditentukan, dan mengembalikan teks yang ditemukan. Jika tidak ada kecocokan yang ditemukan, maka hasilnya adalah null.

Mari kita lihat cara kerjanya, menggunakan contoh simbol yang sama “ e”:

/e/.exec("Hal-hal terbaik di dunia gratis! ");

Karena baris berisi “ e”, Hasil dari kode ini adalah .e.

Menerapkan ekspresi reguler ke string

Dalam Javascript, ekspresi ini juga dapat digunakan dengan dua metode objek String: search() dan replace(). Mereka diperlukan untuk melakukan pencarian dan penggantian dalam teks.

  • Metode pencarian () - menggunakan ekspresi untuk menemukan kecocokan, dan mengembalikan informasi tentang lokasi kecocokan;
  • Ganti () metode - mengembalikan string yang dimodifikasi dengan template yang diganti.

Contoh dari

Menerapkan JS Regular Expression untuk Melakukan Pencarian Case-Sensitive untuk frasa “ w3schools" Di barisan:

var str = "Kunjungi W3Schools"; var n = str.search (/ w3schools / i);

Hasil n adalah 6.

Metode pencarian juga menerima string sebagai argumen. Argumen string akan dikonversi ke ekspresi reguler:

Menggunakan string untuk menemukan frasa “ W3schools" Di barisan.

Ekspresi reguler

Ekspresi reguler adalah objek yang menggambarkan pola karakter. Kelas RegExp dalam JavaScript mewakili ekspresi reguler, dan objek kelas String dan RegExp mendefinisikan metode yang menggunakan ekspresi reguler untuk melakukan pencocokan pola dan operasi pencarian pada teks dengan penggantian. Tata bahasa ekspresi reguler dalam JavaScript berisi subset yang cukup lengkap dari sintaks ekspresi reguler yang digunakan dalam Perl 5, jadi jika Anda berpengalaman dengan bahasa Perl, Anda dapat dengan mudah menggambarkan pola dalam program JavaScript.

Fitur ekspresi reguler Perl yang tidak didukung dalam ECMAScript termasuk flag s (mode satu baris) dan x (sintaks diperpanjang); escape sequence \ a, \ e, \ l, \ u, \ L, \ U, \ E, \ Q, \ A, \ Z, \ z dan \ G dan konstruksi tambahan lainnya yang dimulai dengan (?.

Mendefinisikan ekspresi reguler

Dalam JavaScript, ekspresi reguler diwakili oleh objek RegExp... Objek RegExp dapat dibuat menggunakan konstruktor RegExp (), tetapi lebih sering dibuat menggunakan sintaks literal khusus. Sama seperti literal string yang ditentukan sebagai karakter yang dikutip, literal ekspresi reguler ditentukan sebagai karakter yang diapit oleh pasangan garis miring (/). Dengan demikian, kode JavaScript dapat berisi string seperti ini:

Pola var = / s $ /;

Baris ini membuat objek RegExp baru dan menetapkannya ke variabel pola. Objek RegExp ini mencari string yang diakhiri dengan karakter "s". Ekspresi reguler yang sama dapat didefinisikan menggunakan konstruktor RegExp():

Pola var = RegExp baru ("s $");

Spesifikasi pola regex terdiri dari urutan karakter. Sebagian besar karakter, termasuk semua karakter alfanumerik, secara harfiah menggambarkan karakter yang harus ada. Artinya, ekspresi reguler / java / cocok dengan semua string yang berisi substring "java".

Karakter lain dalam ekspresi reguler tidak dimaksudkan untuk digunakan untuk menemukan padanan yang tepat, melainkan memiliki arti khusus. Misalnya, ekspresi reguler / s $ / berisi dua karakter. S pertama menunjukkan pencarian karakter literal. Kedua, $ adalah metakarakter khusus yang menunjukkan akhir dari sebuah baris. Jadi regex ini akan cocok dengan string apa pun yang diakhiri dengan s.

Bagian berikut menjelaskan berbagai karakter dan metakarakter yang digunakan dalam ekspresi reguler di JavaScript.

Karakter literal

Seperti disebutkan sebelumnya, semua karakter alfabet dan angka dalam ekspresi reguler cocok dengan dirinya sendiri. Sintaks ekspresi reguler dalam JavaScript juga mendukung kemampuan untuk menentukan beberapa karakter non-abjad menggunakan urutan escape yang dimulai dengan karakter garis miring terbalik (\). Misalnya, \ n cocok dengan karakter umpan baris. Simbol-simbol ini tercantum dalam tabel di bawah ini:

Beberapa tanda baca memiliki arti khusus dalam ekspresi reguler:

^ $ . * + ? = ! : | \ / () { } -

Arti dari simbol-simbol ini dijelaskan pada bagian berikut. Beberapa dari mereka memiliki arti khusus hanya dalam konteks regex tertentu, sementara dalam konteks lain mereka diambil secara harfiah. Namun, biasanya, untuk menyertakan salah satu karakter ini secara harfiah dalam ekspresi reguler, Anda harus menambahkannya dengan garis miring terbalik. Karakter lain, seperti tanda kutip dan @, tidak memiliki arti khusus dan hanya mencocokkan diri mereka sendiri dalam ekspresi reguler.

Jika Anda tidak dapat mengingat dengan tepat karakter mana yang harus didahului dengan \, Anda dapat dengan aman meletakkan garis miring terbalik di depan salah satu karakter. Namun, perlu diingat bahwa banyak huruf dan angka memiliki arti khusus jika digabungkan dengan garis miring, sehingga huruf dan angka yang Anda cari secara harfiah tidak boleh didahului dengan \. Untuk memasukkan karakter backslash itu sendiri di regexp, Anda jelas perlu meletakkan karakter backslash lain di depannya. Misalnya, ekspresi reguler berikut cocok dengan string apa pun yang berisi karakter garis miring terbalik: / \\ /.

Kelas karakter

Karakter literal individu dapat digabungkan ke dalam kelas karakter dengan melampirkannya dalam tanda kurung siku. Kelas karakter cocok dengan karakter apa pun yang ada di kelas ini. Oleh karena itu, ekspresi reguler // cocok dengan salah satu karakter a, b, atau c.

Kelas karakter yang dinegasikan juga dapat didefinisikan untuk mencocokkan karakter apa pun selain yang ditunjukkan dalam tanda kurung. Kelas karakter yang dinegasikan ditentukan oleh karakter ^ sebagai karakter pertama setelah tanda kurung kiri. Ekspresi reguler / [^ abc] / cocok dengan karakter apa pun selain a, b, atau c. Di kelas karakter, rentang karakter dapat ditentukan menggunakan tanda hubung. Cari semua karakter alfabet Latin di huruf kecil dilakukan menggunakan ekspresi //, dan setiap huruf atau angka dari rangkaian karakter Latin dapat ditemukan menggunakan ekspresi //.

Kelas karakter tertentu sering digunakan, jadi sintaks ekspresi reguler dalam JavaScript menyertakan karakter khusus dan urutan escape untuk menunjukkannya. Misalnya, \ s cocok dengan spasi putih, tab, dan karakter spasi putih Unicode apa pun, dan \ S cocok dengan karakter spasi putih non-Unicode.

Tabel di bawah ini mencantumkan karakter khusus ini dan sintaks kelas karakter. (Perhatikan bahwa beberapa urutan escape kelas karakter hanya cocok dengan karakter ASCII dan tidak diperluas untuk bekerja dengan karakter Unicode. Anda dapat mendefinisikan secara eksplisit kelas sendiri Karakter Unicode, misalnya / [\ u0400- \ u04FF] / cocok dengan karakter Sirilik mana pun.)

Kelas karakter regex JavaScript
Simbol Korespondensi
[...] Salah satu karakter dalam tanda kurung
[^...] Karakter apa pun yang tidak tercantum dalam tanda kurung
. Karakter apa pun selain baris baru atau pembatas string Unicode lainnya
\ w Setiap karakter teks ASCII. Setara dengan
\ W Karakter apa pun yang bukan karakter teks ASCII. Setara dengan [^ a-zA-Z0-9_]
\ S Semua karakter spasi putih Unicode
\ S Setiap karakter non-spasi dari set Unicode. Perhatikan bahwa \ w dan \ S tidak sama
\ D Setiap digit ASCII. Setara dengan
\ D Setiap karakter selain digit ASCII. Setara dengan [^ 0-9]
[\ B] Karakter spasi mundur literal

Perhatikan bahwa urutan escape untuk karakter khusus kelas dapat diapit dalam tanda kurung siku. \ s cocok dengan karakter spasi putih apa pun dan \ d cocok dengan digit apa pun, oleh karena itu / [\ s \ d] / cocok dengan karakter atau digit spasi putih apa pun.

Pengulangan

Dengan pengetahuan tentang sintaks ekspresi reguler yang diperoleh sejauh ini, kita dapat menggambarkan bilangan dua digit sebagai / \ d \ d / atau bilangan empat digit sebagai / \ d \ d \ d \ d /, tetapi kita tidak bisa, karena contoh, jelaskan angka, sejumlah digit, atau string tiga huruf diikuti dengan digit opsional. Pola yang lebih kompleks ini menggunakan sintaks ekspresi reguler untuk menunjukkan berapa kali elemen ekspresi reguler yang diberikan dapat diulang.

Simbol pengulangan selalu mengikuti pola yang diterapkannya. Beberapa jenis pengulangan cukup sering digunakan, dan ada simbol khusus untuk menunjukkan kasus ini. Misalnya, + cocok dengan satu atau lebih contoh pola sebelumnya. Tabel berikut memberikan ringkasan sintaks pengulangan:

Baris berikut menunjukkan beberapa contoh:

Pola var = / \ d (2,4) /; // Mencocokkan pola angka dua sampai empat digit = / \ w (3) \ d? /; // Cocok dengan tepat tiga karakter kata dan satu pola digit opsional = / \ s + java \ s + /; // Mencocokkan kata "java" dengan satu spasi atau lebih // sebelum dan sesudahnya pattern = / [^ (] * /; // Mencocokkan nol atau lebih karakter selain kurung buka

Hati-hati saat menggunakan karakter pengulangan * dan ?. Mereka dapat sesuai dengan tidak adanya pola yang ditentukan di depan mereka dan, oleh karena itu, dengan tidak adanya simbol. Misalnya, ekspresi reguler / a * / cocok dengan string "bbbb" karena tidak mengandung karakter a.

Karakter pengulangan yang tercantum dalam tabel sesuai dengan jumlah pengulangan maksimum yang dapat digunakan untuk mencari bagian selanjutnya dari ekspresi reguler. Kami mengatakan bahwa ini adalah pengulangan "rakus". Dimungkinkan juga untuk menerapkan pengulangan dengan cara yang tidak serakah. Cukup untuk menunjukkan setelah simbol (atau simbol) pengulangan tanda tanya: ??, + ?, *? atau bahkan (1,5)?.

Misalnya, ekspresi reguler / a + / cocok dengan satu atau lebih contoh huruf a. Diterapkan ke string "aaa", itu cocok dengan ketiga huruf. Di sisi lain, ekspresi / a +? / Cocok dengan satu atau lebih contoh huruf a dan memilih jumlah karakter yang paling sedikit. Diterapkan pada baris yang sama, pola ini hanya cocok dengan huruf pertama a.

Pengulangan yang "tidak aman" tidak selalu memberikan hasil yang diharapkan. Perhatikan pola / a + b /, yang cocok dengan satu atau lebih a diikuti oleh a b. Ketika diterapkan ke string "aaab", itu cocok dengan seluruh string.

Sekarang mari kita periksa versi "tidak serakah" dari / a +? B /. Orang akan berpikir bahwa itu harus cocok dengan karakter b, didahului oleh hanya satu karakter a. Jika diterapkan pada string yang sama, "aaab" diharapkan cocok dengan single a dan b terakhir. Namun, pada kenyataannya seluruh string cocok dengan pola ini, seperti dalam kasus versi "serakah". Intinya adalah pencarian pola ekspresi reguler dilakukan dengan menemukan posisi pertama dalam string dari mana kecocokan menjadi mungkin. Karena kecocokan dimungkinkan dari karakter pertama dari string, kecocokan yang lebih pendek yang dimulai dengan karakter berikutnya bahkan tidak dipertimbangkan.

Alternatif, pengelompokan, dan tautan

Tata bahasa ekspresi reguler mencakup karakter khusus untuk menentukan alternatif, mengelompokkan subekspresi, dan referensi ke subekspresi sebelumnya. Simbol pipa | berfungsi untuk memisahkan alternatif. Misalnya, / ab | cd | ef / cocok dengan string "ab", atau string "cd", atau string "ef", dan pola / \ d (3) | (4) / cocok dengan tiga digit atau empat huruf kecil ...

Perhatikan bahwa alternatif diproses dari kiri ke kanan sampai ditemukan kecocokan. Jika ditemukan kecocokan dengan alternatif kiri, alternatif kanan diabaikan, meskipun kecocokan "lebih baik" dapat dicapai. Oleh karena itu, ketika pola / a | ab / diterapkan pada string "ab", itu hanya akan cocok dengan karakter pertama.

Tanda kurung memiliki beberapa arti dalam ekspresi reguler. Salah satunya adalah pengelompokan elemen individu menjadi satu subekspresi, sehingga elemen saat menggunakan karakter khusus |, *, +,? dan lainnya diperlakukan sebagai satu kesatuan. Misalnya, / java (script)? / Mencocokkan kata "java" diikuti dengan kata opsional "script", dan / (ab | cd) + | ef) / cocok dengan string "ef" atau satu atau lebih pengulangan dari sama dari string "ab" atau "cd".

Penggunaan lain dari tanda kurung dalam ekspresi reguler adalah untuk mendefinisikan subpola dalam suatu pola. Saat kecocokan ekspresi reguler ditemukan di string target, Anda bisa mengekstrak bagian string target yang cocok dengan subpola tanda kurung tertentu.

Misalkan Anda ingin mencari satu atau lebih huruf kecil diikuti oleh satu atau lebih angka. Untuk melakukan ini, Anda dapat menggunakan pola / + \ d + /. Tetapi misalkan juga bahwa kita hanya menginginkan angka di akhir setiap pertandingan. Jika Anda meletakkan bagian pola ini dalam tanda kurung (/ + (\ d +) /), maka Anda dapat mengekstrak angka dari kecocokan apa pun yang kami temukan. Bagaimana ini dilakukan akan dijelaskan di bawah ini.

Terkait dengan ini adalah penggunaan lain dari subekspresi tanda kurung, yang memungkinkan Anda untuk merujuk ke subekspresi dari bagian sebelumnya dari ekspresi reguler yang sama. Ini dilakukan dengan menentukan satu atau lebih digit setelah karakter \. Angka-angka mengacu pada posisi subekspresi yang dikurung dalam ekspresi reguler. Misalnya, \ 1 mengacu pada subekspresi pertama, dan \ 3 mengacu pada yang ketiga. Perhatikan bahwa subekspresi dapat bersarang satu sama lain, jadi posisi kurung kiri digunakan dalam hitungan. Misalnya, dalam ekspresi reguler berikut, referensi subekspresi (cript) bersarang akan terlihat seperti \ 2:

/ (ava (cript)?) \ sis \ s (menyenangkan \ w *) /

Referensi ke subekspresi sebelumnya tidak menunjuk ke pola subekspresi itu, tetapi ke teks yang ditemukan yang cocok dengan pola itu. Oleh karena itu, tautan dapat digunakan untuk memaksakan batasan yang memilih bagian dari string yang berisi karakter yang persis sama. Misalnya, ekspresi reguler berikut cocok dengan nol atau lebih karakter dalam satu atau tanda kutip ganda... Namun, itu tidak mengharuskan tanda kutip pembuka dan penutup cocok satu sama lain (yaitu, kedua tanda kutip tunggal atau ganda):

/[""][^""]*[""]/

Kami dapat meminta tanda kutip untuk dicocokkan melalui tautan seperti itu:

Di sini, \ 1 cocok dengan subekspresi pertama. Dalam contoh ini, tautan memberlakukan batasan bahwa tanda kutip penutup cocok dengan tanda kutip pembuka. Regex ini tidak mengizinkan tanda kutip tunggal di dalam tanda kutip ganda, dan sebaliknya.

Dimungkinkan juga untuk mengelompokkan elemen dalam ekspresi reguler tanpa membuat referensi bernomor ke elemen tersebut. Alih-alih hanya mengelompokkan item di antara (dan), mulailah grup dengan (?: Dan akhiri dengan). Perhatikan, misalnya, pola berikut:

/ (ava (?: cript)?) \ sis \ s (menyenangkan \ w *) /

Di sini subekspresi (?: Cript) hanya diperlukan untuk pengelompokan agar karakter pengulangan? Dapat diterapkan pada grup. Tanda kurung yang dimodifikasi ini tidak membuat tautan, jadi dalam ekspresi reguler ini, \ 2 merujuk ke teks yang cocok dengan polanya (menyenangkan \ w *).

Tabel berikut mencantumkan alternatif, pengelompokan, dan operator referensi dalam ekspresi reguler:

Pemilihan Javascript, pengelompokan, dan referensi karakter regex
Simbol Arti
| Alternatif. Cocok dengan subekspresi di kiri atau subekspresi di kanan.
(...) Pengelompokan. Mengelompokkan elemen menjadi satu kesatuan yang dapat digunakan dengan karakter *, +,?, | dll. Juga mengingat simbol yang sesuai dengan grup ini untuk digunakan di tautan berikutnya.
(?:...) Pengelompokan saja. Mengelompokkan elemen menjadi satu kesatuan, tetapi tidak mengingat simbol yang sesuai dengan grup ini.
\ nomor Mencocokkan karakter yang sama yang ditemukan saat mencocokkan grup dengan nomor nomor. Grup adalah subekspresi dalam tanda kurung (mungkin bersarang). Nomor grup ditetapkan dengan menghitung tanda kurung kiri dari kiri ke kanan. Grup yang dibentuk dengan simbol (?: Tidak diberi nomor.

Menentukan posisi pertandingan

Seperti yang dijelaskan sebelumnya, banyak elemen regexp cocok dengan satu karakter per string. Misalnya, \ s cocok dengan satu karakter spasi. Elemen ekspresi reguler lainnya cocok dengan posisi antar karakter, bukan karakter itu sendiri. Misalnya, \ b cocok dengan batas kata — batas antara \ w (karakter teks ASCII) dan \ W (karakter non-teks), atau batas antara karakter teks ASCII dan awal atau akhir baris.

Elemen seperti \ b tidak mendefinisikan karakter apa pun yang harus ada dalam string yang ditemukan, tetapi elemen tersebut menentukan posisi yang valid untuk pencocokan. Elemen-elemen ini kadang-kadang disebut elemen jangkar regex karena mereka menambatkan pola ke posisi tertentu dalam string. Elemen jangkar yang paling umum digunakan adalah ^ dan $, yang masing-masing memiliki pola jangkar ke awal dan akhir baris.

Misalnya, kata "JavaScript" pada barisnya sendiri dapat ditemukan menggunakan ekspresi reguler / ^ JavaScript $ /. Untuk menemukan satu kata "Java" (dan bukan awalan, misalnya, dalam kata "JavaScript"), Anda dapat mencoba menggunakan pola / \ sJava \ s /, yang memerlukan spasi sebelum dan sesudah kata.

Tetapi solusi ini menimbulkan dua masalah. Pertama, ia hanya akan menemukan kata "Java" jika dikelilingi oleh spasi di kedua sisi, dan tidak dapat menemukannya di awal atau akhir baris. Kedua, ketika pola ini cocok, string yang dikembalikan olehnya akan berisi spasi awal dan akhir, yang tidak persis seperti yang kita inginkan. Jadi, alih-alih pola yang cocok dengan spasi \ s, kita akan menggunakan pola (atau jangkar) yang cocok dengan batas kata \ b. Ekspresi berikut akan berubah: / \ bJava \ b /.

Elemen jangkar \ B cocok dengan posisi yang bukan merupakan batas kata. Artinya, pola / \ Bcript / akan cocok dengan kata "JavaScript" dan "postscript" dan tidak akan cocok dengan kata "script" atau "Scripting".

Ekspresi reguler arbitrer juga dapat digunakan sebagai kondisi jangkar. Menempatkan ekspresi di antara karakter (? = Dan) mengubahnya menjadi kecocokan lookahead dengan karakter berikutnya, mengharuskan karakter tersebut untuk mencocokkan pola yang ditentukan, tetapi tidak untuk disertakan dalam string pencocokan.

Misalnya, untuk mencocokkan nama bahasa pemrograman umum yang diikuti dengan titik dua, Anda dapat menggunakan ekspresi / ava (cript)? (? = \:) /. Pola ini cocok dengan kata "JavaScript" pada string "JavaScript: The Definitive Guide", tetapi tidak akan cocok dengan kata "Java" pada string "Java in a Nutshell" karena tidak diikuti oleh titik dua.

Jika Anda memasukkan kondisi (?!, maka akan menjadi lookahead negatif untuk karakter berikutnya, mengharuskan karakter berikut tidak sesuai dengan pola yang ditentukan. Misalnya, pola / Java (?! Script) (\ w *) / cocok dengan substring "Java", diikuti oleh huruf kapital dan sejumlah karakter teks ASCII, asalkan substring "Java" tidak diikuti oleh substring "Script". Ini akan cocok dengan string "JavaBeans" tetapi bukan string "Javanese", itu akan cocok dengan string "JavaScrip" tetapi bukan string "JavaScript" atau "JavaScripter".

Tabel di bawah ini mencantumkan karakter jangkar ekspresi reguler:

Karakter Jangkar Ekspresi Reguler
Simbol Arti
^ Mencocokkan awal ekspresi string atau awal string dalam pencarian multi-baris.
$ Mencocokkan akhir ekspresi string atau akhir string dalam pencarian multi-baris.
\ B Sesuai dengan batas kata, mis. cocok dengan posisi antara karakter \ w dan karakter \ W, atau antara karakter \ w dan awal atau akhir string. (Namun, perhatikan bahwa [\ b] cocok dengan karakter spasi mundur.)
\ B Mencocokkan posisi yang bukan merupakan batas kata.
(? = p) Pemeriksaan lookahead positif untuk karakter berikutnya. Memerlukan karakter berikutnya untuk mencocokkan p, tetapi tidak menyertakan karakter tersebut dalam string yang ditemukan.
(?! P) Periksa lookahead negatif untuk karakter berikutnya. Memerlukan karakter berikut agar tidak cocok p.

Bendera

Dan satu lagi, elemen terakhir dari tata bahasa ekspresi reguler. Bendera ekspresi reguler menentukan aturan pencocokan pola tingkat tinggi. Berbeda dengan tata bahasa ekspresi reguler lainnya, tanda tidak ditentukan di antara karakter garis miring, tetapi setelah yang kedua. Ada tiga flag yang didukung dalam JavaScript.

Tandai saya menentukan bahwa pencocokan pola harus peka huruf besar-kecil, dan bendera g- bahwa pencarian harus bersifat global, mis. semua kecocokan dalam string harus ditemukan. Tandai saya mencari pola dalam mode multiline. Jika ekspresi string yang dicari berisi karakter umpan baris, maka dalam mode ini karakter jangkar ^ dan $, selain mencocokkan awal dan akhir seluruh ekspresi string, juga mencocokkan awal dan akhir setiap string teks. Misalnya, / java $ / im cocok dengan "java" dan "Java \ nis fun".

Bendera ini dapat digabungkan dalam kombinasi apa pun. Misalnya, untuk mencari kemunculan pertama kata "java" (atau "Java", "JAVA", dll.) dengan cara yang tidak peka huruf besar/kecil, Anda dapat menggunakan ekspresi reguler case-insensitive / \ bjava \ b / i. Dan untuk menemukan semua kemunculan kata ini dalam sebuah string, Anda dapat menambahkan flag g: / \ bjava \ b / gi.

Metode kelas string untuk pencocokan pola

Sampai saat ini, kita telah membahas tata bahasa dari regexp yang dihasilkan, tetapi belum melihat bagaimana regexp sebenarnya dapat digunakan dalam JavaScript. Di bagian ini, kita akan membahas metode objek String yang menggunakan ekspresi reguler untuk pencocokan pola dan pencarian dan penggantian. Kemudian kita akan melanjutkan diskusi kita tentang pencocokan pola dengan ekspresi reguler dengan melihat objek RegExp dan metode serta propertinya.

String mendukung empat metode menggunakan ekspresi reguler. Yang paling sederhana adalah metodenya Cari ()... Dibutuhkan ekspresi reguler sebagai argumen dan mengembalikan posisi karakter pertama dari substring yang ditemukan, atau -1 jika tidak ada kecocokan yang ditemukan. Misalnya, panggilan berikut akan mengembalikan 4:

Var result = "JavaScript" .search (/ script / i); // 4

Jika argumen ke metode pencarian () bukan ekspresi reguler, pertama-tama ia dikonversi dengan meneruskannya ke konstruktor RegExp. Metode search () tidak mendukung pencarian global dan mengabaikan flag g dalam argumennya.

metode mengganti () melakukan operasi pencarian dan penggantian. Dibutuhkan ekspresi reguler sebagai argumen pertama dan string pengganti sebagai yang kedua. Metode mencari baris yang dipanggil untuk mencocokkan pola yang ditentukan.

Jika ekspresi reguler berisi flag g, metode replace () menggantikan semua kecocokan yang ditemukan dengan string pengganti. Jika tidak, itu hanya menggantikan kecocokan pertama yang ditemukannya. Jika argumen pertama dari metode replace () adalah string dan bukan ekspresi reguler, maka metode melakukan pencarian literal untuk string, daripada mengubahnya menjadi ekspresi reguler menggunakan konstruktor RegExp (), sebagai pencarian () metode tidak.

Sebagai contoh, kita dapat menggunakan metode replace () untuk menggunakan huruf kapital secara konsisten pada kata "JavaScript" untuk seluruh baris teks:

// Terlepas dari kasus karakter, ganti dengan kata dalam kasus yang diperlukan var result = "javascript" .replace (/ JavaScript / ig, "JavaScript");

Metode replace () lebih kuat daripada yang mungkin disarankan oleh contoh ini. Izinkan saya mengingatkan Anda bahwa subekspresi dalam kurung di dalam ekspresi reguler diberi nomor dari kiri ke kanan, dan ekspresi reguler mengingat teks yang cocok dengan setiap subekspresi. Jika string pengganti berisi $ diikuti oleh digit, metode replace () menggantikan dua karakter tersebut dengan teks yang cocok dengan subekspresi yang ditentukan. Ini adalah fitur yang sangat berguna. Kita dapat menggunakannya, misalnya, untuk mengganti tanda kutip lurus dalam string dengan tanda kutip tipografi, yang disimulasikan oleh karakter ASCII:

// Kutipan adalah kutipan yang diikuti oleh sejumlah karakter non-kutipan (kita ingat mereka), // karakter ini diikuti oleh kutipan lain var kutipan = / "([^"] *) "/ g; // Ganti tanda kutip lurus dengan tanda kutip dan biarkan "$1" tidak berubah // isi kutipan disimpan dalam $ 1 var text = "" JavaScript "adalah bahasa pemrograman yang ditafsirkan."; Var result = text.replace (kutipan, "" $1 "" ; // "JavaScript" adalah bahasa pemrograman yang ditafsirkan.

Poin penting yang perlu diperhatikan adalah bahwa argumen kedua untuk mengganti () dapat berupa fungsi yang secara dinamis menghitung string pengganti.

metode cocok () adalah metode ekspresi reguler yang paling umum dari kelas String. Dibutuhkan ekspresi reguler sebagai satu-satunya argumennya (atau mengubah argumennya menjadi ekspresi reguler dengan meneruskannya ke konstruktor RegExp ()) dan mengembalikan array yang berisi hasil pencarian. Jika flag g diatur dalam ekspresi reguler, metode ini mengembalikan larik semua kecocokan dalam string. Sebagai contoh:

// akan mengembalikan ["1", "2", "3"] var result = "1 ditambah 2 sama dengan 3" .match (/ \ d + / g);

Jika ekspresi reguler tidak berisi flag g, metode match() tidak melakukan pencarian global; itu hanya mencari pertandingan pertama. Namun, match() mengembalikan array bahkan ketika metode tidak melakukan pencarian global. Dalam hal ini, elemen pertama dari array adalah substring yang ditemukan, dan semua elemen yang tersisa adalah subekspresi dari ekspresi reguler. Oleh karena itu, jika match() mengembalikan array arr, maka arr akan berisi seluruh string yang ditemukan, arr akan berisi substring yang cocok dengan subekspresi pertama, dan seterusnya. Paralel metode replace (), kita dapat mengatakan bahwa arr [n] diisi dengan isi $ n.

Misalnya, lihat kode berikut untuk mengurai URL:

Var url = /(\w+):\/\/((\w.tory+)\/(\S*)/; var text = "Kunjungi situs kami http: //www..php"; var hasil = text.match (url); if (hasil! = null) (var fullurl = hasil; // Berisi "http: //www..php" var protokol = hasil; // Berisi "http" var host = hasil; // Berisi "www..php ")

Perlu dicatat bahwa untuk ekspresi reguler yang tidak memiliki flag pencarian global g yang disetel, metode match() mengembalikan nilai yang sama dengan metode exec() dari ekspresi reguler: array yang dikembalikan memiliki properti indeks dan input, seperti dijelaskan dalam pembahasan exec ( ) di bawah ini.

Metode terakhir dari objek String yang menggunakan ekspresi reguler adalah membelah ()... Metode ini membagi string yang dipanggil menjadi array substring menggunakan argumen sebagai pembatas. Sebagai contoh:

"123.456.789" .split (","); // Mengembalikan ["123", "456", "789"]

Metode split () juga dapat menggunakan ekspresi reguler sebagai argumen. Ini membuat metode ini lebih kuat. Misalnya, Anda dapat menentukan pembatas yang memungkinkan sejumlah karakter spasi putih di kedua sisi:

"1, 2, 3, 4, 5" .split (/ \ s *, \ s * /); // Mengembalikan ["1", "2", "3", "4", "5"]

objek RegExp

Seperti disebutkan, ekspresi reguler direpresentasikan sebagai objek RegExp. Selain konstruktor RegExp (), objek RegExp mendukung tiga metode dan beberapa properti.

Konstruktor RegExp () mengambil satu atau dua argumen string dan membuat objek RegExp baru. Argumen pertama ke konstruktor adalah string yang berisi isi ekspresi reguler, mis. teks yang harus muncul di antara karakter garis miring dalam literal regex. Perhatikan bahwa literal string dan ekspresi reguler menggunakan karakter \ untuk menunjukkan urutan escape, jadi ketika meneruskan ekspresi reguler ke konstruktor RegExp () sebagai literal string, Anda harus mengganti setiap \ dengan pasangan \\.

Argumen kedua untuk RegExp () mungkin hilang. Jika ditentukan, ini mendefinisikan flag dari ekspresi reguler. Itu harus salah satu dari karakter g, i, m, atau kombinasi dari karakter ini. Sebagai contoh:

// Menemukan semua angka 5 digit dalam sebuah string. Catatan // penggunaan \\ var zipcode = new RegExp ("\\ d (5)", "g");

Konstruktor RegExp () berguna ketika ekspresi reguler dihasilkan secara dinamis dan oleh karena itu tidak dapat direpresentasikan menggunakan sintaks literal ekspresi reguler. Misalnya, untuk menemukan string yang dimasukkan oleh pengguna, Anda membuat ekspresi reguler saat runtime menggunakan RegExp ().

Properti RegExp

Setiap objek RegExp memiliki lima properti. Properti sumber- string hanya-baca yang berisi teks ekspresi reguler. Properti global - boolean Tanda baca-saja yang menentukan tanda g dalam ekspresi reguler. Properti abaikan kasus adalah nilai boolean baca-saja yang menentukan apakah tanda i ada dalam ekspresi reguler. Properti banyak baris adalah nilai boolean read-only yang menentukan keberadaan flag m dalam ekspresi reguler. Dan properti terakhir indeks terakhir adalah bilangan bulat baca/tulis. Untuk pola dengan flag g, properti ini berisi nomor posisi dalam string di mana pencarian berikutnya harus dimulai. Seperti dijelaskan di bawah, ini digunakan oleh metode exec() dan test().

Metode RegExp

Objek RegExp mendefinisikan dua metode yang melakukan pencocokan pola; mereka berperilaku mirip dengan metode kelas String yang dijelaskan di atas. Metode utama dari kelas RegExp yang digunakan untuk pencocokan pola adalah eksekutif ()... Ini mirip dengan metode match() kelas String yang disebutkan sebelumnya, kecuali bahwa itu adalah metode kelas RegExp yang menggunakan string sebagai argumen, dan bukan metode kelas String yang menggunakan argumen RegExp.

Metode exec() mengeksekusi ekspresi reguler pada string yang ditentukan, mis. mencari kecocokan dalam string. Jika tidak ada kecocokan yang ditemukan, metode mengembalikan null. Namun, jika kecocokan ditemukan, ia mengembalikan larik yang sama dengan larik yang dikembalikan oleh metode match() untuk pencarian tanpa flag g. Elemen nol dari larik berisi string yang cocok dengan ekspresi reguler, dan semua elemen berikutnya adalah substring yang cocok dengan semua subekspresi. Selain itu, properti indeks berisi nomor posisi karakter dengan mana fragmen yang sesuai dimulai, dan properti memasukkan mengacu pada string yang dicari.

Tidak seperti match(), metode exec() mengembalikan array yang strukturnya tidak bergantung pada keberadaan flag g dalam ekspresi reguler. Izinkan saya mengingatkan Anda bahwa saat meneruskan ekspresi reguler global, metode match() mengembalikan larik kecocokan yang ditemukan. Dan exec () selalu mengembalikan satu kecocokan, tetapi menyediakannya informasi lengkap... Ketika exec() dipanggil pada ekspresi reguler yang berisi flag g, metode ini menetapkan properti lastIndex dari objek ekspresi reguler ke nomor posisi karakter segera setelah substring yang ditemukan.

Ketika metode exec() dipanggil untuk kedua kalinya untuk ekspresi reguler yang sama, metode tersebut mulai mencari karakter yang posisinya ditentukan dalam properti lastIndex. Jika exec () tidak menemukan kecocokan, properti lastIndex diatur ke 0. (Anda juga dapat mengatur lastIndex ke nol kapan saja, yang harus dilakukan dalam semua kasus di mana pencarian selesai sebelum kecocokan terakhir pada baris yang sama adalah ditemukan, dan mulai mencari pada string lain dengan objek RegExp yang sama.) Perilaku khusus ini memungkinkan exec () dipanggil berulang kali untuk mengulangi semua kecocokan ekspresi reguler dalam string. Sebagai contoh:

Pola var = / Java / g; var text = "JavaScript lebih lucu dari Java!"; hasil var; while ((hasil = pattern.exec (teks))! = null) (console.log ("Ditemukan" "+ hasil +" "" + "di posisi" + result.index + "; pencarian berikutnya akan dimulai dengan" + pola .lastIndex);)

Metode lain dari objek RegExp - tes () yang jauh lebih sederhana daripada metode exec(). Dibutuhkan string dan mengembalikan nilai true jika string cocok dengan ekspresi reguler:

Pola var = / java / i; pattern.test("JavaScript"); // Mengembalikan nilai true

Memanggil test() sama dengan memanggil exec(), mengembalikan nilai true jika exec() mengembalikan non-null. Untuk alasan ini, metode test() berperilaku sama dengan metode exec() saat dipanggil untuk ekspresi reguler global: metode ini mulai mencari string yang ditentukan pada posisi yang diberikan oleh properti lastIndex, dan jika menemukan kecocokan, set properti lastIndex ke nomor posisi karakter, tepat di sebelah kecocokan yang ditemukan. Oleh karena itu, dengan menggunakan metode test(), Anda juga dapat membentuk loop untuk melintasi garis seperti metode exec().

RegExp baru (pola [, bendera])

regex SEBELUM

Diketahui bahwa sintaks literal yang disukai(/ tes / i).

Jika ekspresi reguler tidak diketahui sebelumnya, maka lebih baik membuat ekspresi reguler (dalam string karakter) menggunakan konstruktor (RegExp baru).

Tetapi perhatikan, karena "garis miring" \ berperan sebagai pengalih kode, maka dalam string literal (regExp baru) harus ditulis dua kali: \\

Bendera

saya mengabaikan kasus saat mencocokkan

g kecocokan global, sebagai lawan dari lokal (secara default, hanya mencocokkan contoh pertama dari pola) memungkinkan kecocokan ke semua contoh pola

Operator

Apa Bagaimana Keterangan Penggunaan
Saya bendera membuat reg. ekspresi tidak peka huruf besar-kecil / testik / i
G bendera pencarian global / testik / g
M bendera dapat dicocokkan dengan banyak string yang dapat diambil dari textarea
operator kelas karakter pencocokan set karakter - karakter apa pun dalam rentang dari a hingga z;
^ tanda operator kecuali [^ a-z] - karakter apa pun KECUALI karakter dalam rentang dari a hingga z;
- operator tanda hubung menunjukkan kisaran nilai, inklusif - karakter apa pun dalam rentang dari a hingga z;
\ melarikan diri operator lolos dari karakter berikutnya \\
^ operator awal pertandingan pencocokan pola harus terjadi di awal / ^ testik / g
$ operator akhir pertandingan pencocokan pola harus terjadi di akhir / testik $ / g
? operator? membuat karakter opsional / t? est / g
+ operator + / t + est / g
+ operator + simbol harus ada sekali atau berulang kali / t + est / g
* operator * simbol harus ada sekali atau berulang kali, atau tidak sama sekali / t + est / g
{} operator () atur jumlah pengulangan karakter yang tetap / t (4) est / g
{,} operator (,) mengatur jumlah pengulangan karakter dalam batas-batas tertentu / t (4,9) est / g

Kelas karakter yang telah ditentukan sebelumnya

Anggota yang telah ditentukan sebelumnya Perbandingan
\ T tab horisontal
\ n Terjemahan baris
. Karakter apa pun selain Umpan baris
\ D Setiap digit kesepuluh, yang sama dengan
\ D Karakter apa pun selain digit kesepuluh, yang sama dengan [^ 0-9]
\ w Karakter apa saja (angka, huruf, dan garis bawah) yang sama
\ W Karakter apa pun selain angka, huruf, dan garis bawah, yang sama dengan [^ A-Za-z0-9]
\ S Karakter ruang apa pun
\ S Karakter apa pun selain spasi
\ B Batas kata
\ B BUKAN batas kata, tetapi internalnya. bagian

Pengelompokan ()

Jika Anda ingin menerapkan operator, misalnya, + (/ (abcd) + /) ke grup anggota, Anda dapat menggunakan tanda kurung ().

Fiksasi

Bagian dari ekspresi reguler yang diapit tanda kurung () disebut fiksasi.

Perhatikan contoh berikut:

/ ^ () k \ 1 /

\ 1 bukan sembarang karakter dari a, b, c.
\ 1 adalah karakter apa pun yang memulai cocok dengan karakter pertama... Artinya, karakter yang cocok dengan \ 1 tidak diketahui sampai regex diselesaikan.

Grup tidak tetap

Tanda kurung () digunakan dalam 2 kasus: untuk pengelompokan dan untuk melakukan. Tetapi ada situasi ketika kita perlu menggunakan () hanya untuk pengelompokan, karena tidak ada komit yang diperlukan, selain itu, dengan menghapus komit yang tidak perlu, kita mempermudah mesin pemrosesan ekspresi reguler.

Jadi untuk mencegah komit sebelum kurung buka, Anda harus meletakkan :?:

str = "

Halo dunia!
"; ditemukan = str.cocok (/<(?:\/?)(?:\w+)(?:[^>] *?)> / i); console.log ("ditemukan tanpa perbaikan:", ditemukan); // ["
" ]

Fungsi tes

Regexp.test ()

Fungsi tes memeriksa apakah ekspresi reguler cocok dengan string (str). Mengembalikan benar atau salah.

Contoh penggunaan:

Javascript

fungsi codeF (str) (kembali /^\d(5)-\d(2)/.test(str);) //console.log(codeF("12345-12ss ")); // true //console.log(codeF("1245-12ss ")); // Salah

Fungsi pertandingan

str.match (regexp)

Fungsi kecocokan mengembalikan larik nilai, atau nol jika tidak ada kecocokan yang ditemukan. Coba lihat: jika bendera g tidak ada dalam ekspresi reguler (untuk melakukan pencarian global), maka metode pencocokan akan mengembalikan kecocokan pertama dalam string, sementara, seperti yang Anda lihat dari contoh, dalam larik kecocokan mendapatkan TETAP(bagian dari ekspresi reguler yang diapit tanda kurung).

Javascript

str = "Untuk informasi lihat: Bab 3.4.5.1"; re = / head (\ d + (\. \ d) *) / i // dengan commit (tidak ada kotak centang global) ditemukan = str.match (re) console.log (ditemukan); // ["Bab 3.4.5.1", "3.4.5.1", ".1"]

Jika Anda menyediakan metode match() dengan ekspresi reguler global (dengan flag g), maka array juga akan dikembalikan, tapi dengan pertandingan GLOBAL... Artinya, tidak ada hasil komitmen yang dikembalikan.

Javascript

str = "Untuk informasi lihat: Bab 3.4.5.1, Bab 7.5"; re = / head (\ d + (\. \ d) *) / ig // tidak ada commit - ditemukan secara global = str.match (re) console.log (ditemukan); // ["Bab 3.4.5.1", "Bab 7.5"]

fungsi eksekutif

regexp.exec (str)

Fungsi exec memeriksa apakah ekspresi reguler cocok dengan string (str). Mengembalikan array hasil (dengan komit) atau nol. Setiap panggilan berikutnya ke metode exec (misalnya, saat menggunakan while) terjadi (karena pembaruan otomatis ketika mengeksekusi exec dari indeks akhir pencarian terakhir lastIndex) pergi ke pertandingan global berikutnya (jika flag g dicentang).

Javascript

varhtml = "
BAM! GELANDANGAN!
"; var reg = /<(\/?)(\w+)([^>] *?)> / g; //console.log(reg.exec(html)); // ["
"," "," div "," class = "test" "] while ((match = reg.exec (html))! == null) (console.log (reg.exec (html));) / * [" "," "," B "," "] [" "," "," em "," "] ["
"," / "," div "," "] * /

Tanpa flag global, metode match dan exec bekerja secara identik. Artinya, mereka mengembalikan array dengan kecocokan global pertama dan melakukan.

Javascript

// cocokkan var html = "
BAM! GELANDANGAN!
"; var reg = /<(\/?)(\w+)([^>] *?)> /; // tidak ada console.log global (html.match (reg)); // ["
"," "," div "," class = "test" "] // exec var html ="
BAM! GELANDANGAN!
"; var reg = /<(\/?)(\w+)([^>] *?)> /; // tidak ada console.log global (reg.exec (html)); // ["
"," "," div "," class = "test" "]

Ganti fungsi

str.replace (regexp, newSubStr | fungsi)
  • regexp - reg. ekspresi;
  • newSubStr - baris di mana ekspresi yang ditemukan dalam teks diubah;
  • function - dipanggil untuk setiap kecocokan yang ditemukan dengan daftar parameter variabel (ingat bahwa pencarian global dalam sebuah string menemukan semua contoh kecocokan pola).

Nilai kembalian dari fungsi ini berfungsi sebagai pengganti.

Parameter fungsi:

  • 1 - Lengkapi substring yang cocok.
  • 2 - Arti kelompok kurung (fiksasi).
  • 3 - Indeks (posisi) kecocokan dalam string asli.
  • 4 - Tali asli.

Metode ini tidak mengubah string panggilan, tetapi mengembalikan yang baru setelah mengganti kecocokan. Untuk melakukan pencarian dan penggantian global, gunakan regexp dengan flag g.

"GHGHGHGTTTT" .ganti (// g, "K"); // "KKKKKKKKKKK"

Javascript

function upLetter (allStr, letter) (mengembalikan letter.toUpperCase();) var res = "border-top-width" .replace (/ - (\ w) / g, upLetter); console.log (res); // borderTopLebar

Terakhir diperbarui: 1.11.2015

Ekspresi reguler mewakili pola yang digunakan untuk menemukan atau memodifikasi string. Untuk bekerja dengan ekspresi reguler dalam JavaScript, sebuah objek didefinisikan RegExp.

Ada dua cara untuk mendefinisikan ekspresi reguler:

Var myExp = / halo /; var myExp = RegExp baru ("halo");

Ekspresi reguler yang digunakan di sini cukup sederhana: terdiri dari satu kata "halo". Dalam kasus pertama, ekspresi ditempatkan di antara dua garis miring, dan dalam kasus kedua, konstruktor RegExp digunakan, di mana ekspresi dilewatkan sebagai string.

Metode RegExp

Untuk menentukan apakah ekspresi reguler cocok dengan string, metode test () didefinisikan di objek RegExp. Metode ini mengembalikan nilai true jika string cocok dengan ekspresi reguler, dan false jika tidak.

Var initialText = "halo dunia!"; var exp = / halo /; var hasil = exp.test (teks awal); document.write (hasil + "
"); // true initialText =" beautifull weather "; result = exp.test (initialText); document.write (hasil); // false - tidak ada "halo" di baris initialText

Metode exec bekerja dengan cara yang sama - ia juga memeriksa apakah string cocok dengan ekspresi reguler, hanya sekarang metode ini mengembalikan bagian string yang cocok dengan ekspresi. Jika tidak ada kecocokan, maka null dikembalikan.

Var initialText = "halo dunia!"; var exp = / halo /; var hasil = exp.exec (teks awal); document.write (hasil + "
"); // hello initialText =" cuaca bagus "; hasil = exp.exec (teks awal); document.write (hasil); // null

Kelompok karakter

Ekspresi reguler tidak harus berupa string biasa, tetapi juga dapat menyertakan elemen sintaks ekspresi reguler khusus. Salah satu elemen ini mewakili kelompok karakter yang diapit dalam tanda kurung siku. Sebagai contoh:

Var initialText = "pertahanan"; var exp = / [abc] /; var hasil = exp.test (teks awal); document.write (hasil + "
"); // true initialText =" city "; result = exp.test (initialText); document.write (hasil); // false

Ekspresi [abc] menunjukkan bahwa string harus memiliki salah satu dari tiga huruf.

Jika kita perlu menentukan keberadaan karakter alfabet dari rentang tertentu dalam sebuah string, maka kita dapat mengatur rentang ini sekali:

Var initialText = "pertahanan"; var exp = / [a-z] /; var hasil = exp.test (teks awal); document.write (hasil + "
"); // true initialText =" 3di0789 "; result = exp.test (initialText); document.write (hasil); // false

Dalam hal ini, string harus mengandung setidaknya satu karakter dari rentang a-z.

Sebaliknya, jika string tidak perlu hanya memiliki karakter tertentu, maka tanda ^ harus diletakkan di dalam tanda kurung siku sebelum penghitungan karakter:

Var initialText = "pertahanan"; var exp = / [^ a-z] /; var hasil = exp.test (teks awal); document.write (hasil + "
"); // false initialText =" 3di0789 "; exp = / [^ 0-9] /; result = exp.test (initialText); document.write (hasil); // true

Dalam kasus pertama, string seharusnya tidak hanya memiliki karakter dari rentang az, tetapi karena string "pertahanan" hanya terdiri dari karakter dari rentang ini, metode test () mengembalikan false, yaitu, ekspresi reguler tidak cocok dengan persediaan.

Dalam kasus kedua ("3di0789"), string tidak boleh hanya berisi karakter numerik. Tetapi karena string juga berisi huruf, string cocok dengan ekspresi reguler, jadi metode pengujian mengembalikan nilai true.

Jika perlu, kami dapat mengumpulkan kombinasi ekspresi:

Var initialText = "rumah"; var exp = / [dt] o [nm] /; var hasil = exp.test (teks awal); document.write (hasil); // benar

Ekspresi [dt] o [nm] menunjukkan string yang mungkin berisi substring "house", "volume", "don", "tone".

properti ekspresi

    Properti global memungkinkan Anda menemukan semua substring yang cocok dengan ekspresi reguler. Secara default, saat mencari substring, ekspresi reguler memilih substring yang pertama kali ditemukan dari string yang cocok dengan ekspresi. Meskipun ada banyak substring dalam string yang juga cocok dengan ekspresi. Untuk ini, properti ini digunakan dalam bentuk simbol g dalam ekspresi

    Properti abaikanCase memungkinkan Anda menemukan substring yang cocok dengan ekspresi reguler, terlepas dari besar kecilnya karakter dalam string. Untuk melakukan ini, karakter i digunakan dalam ekspresi reguler

    Properti multiline memungkinkan Anda menemukan substring yang cocok dengan ekspresi reguler dalam teks multiline. Untuk melakukan ini, simbol m digunakan dalam ekspresi reguler.

Sebagai contoh:

Var initialText = "halo dunia"; var exp = / dunia /; var hasil = exp.test (teks awal); // Salah

Tidak ada kecocokan antara string dan ekspresi, karena "Dunia" berbeda dari "dunia" dalam kasus. Dalam hal ini, Anda perlu mengubah ekspresi reguler dengan menambahkan properti abaikanCase ke dalamnya:

Var exp = / dunia / i;

Nah, kita juga bisa menggunakan beberapa properti sekaligus.