Saran tim Anda hampir benar, kecuali kesalahan yang telah dibuat. Begitu Anda mengetahui alasannya, Anda tidak akan pernah melupakannya. Perhatikan kesalahan ini.
/^(7|8|9)\d{9}$/
Apa fungsinya:
^
dan $
menunjukkan kecocokan berlabuh, yang menegaskan bahwa subpola di antara jangkar ini adalah kecocokan keseluruhan. String hanya akan cocok jika subpola cocok dengan keseluruhannya, bukan hanya satu bagian.
()
menunjukkan grup penangkap .
7|8|9
menunjukkan pencocokan baik dari 7
, 8
atau 9
. Ini dilakukan dengan pergantian , yang dilakukan oleh operator pipa |
- bergantian di antara pergantian. Ini backtrack antara pergantian: Jika pergantian pertama tidak cocok, mesin harus kembali sebelum lokasi penunjuk dipindahkan selama pertandingan pergantian, untuk terus mencocokkan pergantian berikutnya; Sedangkan kelas karakter bisa maju secara berurutan. Lihat pertandingan ini di mesin regex dengan pengoptimalan dinonaktifkan:
Pattern: (r|f)at
Match string: carat
Pattern: [rf]at
Match string: carat
\d{9}
cocok dengan sembilan digit. \d
adalah karakter meta singkat, yang cocok dengan sembarang digit.
/^[7|8|9][\d]{9}$/
Lihat apa fungsinya:
^
dan $
menunjukkan pertandingan berlabuh juga.
[7|8|9]
adalah kelas karakter . Karakter dari daftar 7
, |
, 8
, |
, atau 9
dapat dicocokkan, sehingga |
ditambahkan di salah. Ini cocok tanpa mundur.
[\d]
adalah kelas karakter yang mendiami metakarakter \d
. Ngomong-ngomong, kombinasi penggunaan kelas karakter dan satu karakter meta adalah ide yang buruk, karena lapisan abstraksi dapat memperlambat pertandingan, tetapi ini hanya detail implementasi dan hanya berlaku untuk beberapa implementasi regex. JavaScript bukanlah satu, tetapi membuat subpola sedikit lebih panjang.
{9}
menunjukkan konstruk tunggal sebelumnya diulang sembilan kali secara total.
Regex optimal adalah /^[789]\d{9}$/
, karena /^(7|8|9)\d{9}$/
menangkap secara tidak perlu yang menyebabkan penurunan performa pada sebagian besar implementasi regex (javascriptkebetulan menjadi satu, mengingat pertanyaannya menggunakan kata kunci var
dalam kode, ini mungkin JavaScript). Penggunaanphpyang berjalan pada PCRE untuk pencocokan preg akan mengoptimalkan kekurangan backtracking, namun kami juga tidak menggunakan PHP, jadi menggunakan kelas []
alih-alih pergantian |
memberikan bonus kinerja karena pertandingan tidak mundur, dan karena itu keduanya cocok dan gagal lebih cepat daripada menggunakan Anda ekspresi reguler sebelumnya.
(7|8|9)
dan[789]
tidak setara, karena yang pertama menangkap, yang terakhir tidak.(?:7|8|9)
akan menjadi setara di sisi lain (saya kira Anda tahu itu tentu saja ...).