Alat dan versi yang berbeda mendukung variasi ekspresi reguler yang berbeda. Dokumentasi masing-masing akan memberi tahu Anda apa yang mereka dukung.
Ada standar sehingga seseorang dapat mengandalkan serangkaian fitur minimum yang tersedia di semua aplikasi yang sesuai.
Sebagai contoh, semua implementasi modern sed
dan grep
implementasi ekspresi reguler dasar seperti yang ditentukan oleh POSIX (setidaknya satu versi atau yang lain dari standar, tetapi standar itu belum banyak berkembang dalam hal itu dalam beberapa dekade terakhir).
Di POSIX BRE dan ERE, Anda memiliki [:alnum:]
kelas karakter. Yang cocok dengan huruf dan angka di lokal Anda (catatan yang sering mencakup lebih banyak daripada a-zA-Z0-9
kecuali lokal adalah C).
Begitu:
grep -x '[[:alnum:]_]\{1,\}'
cocok dengan satu atau lebih alnum atau _.
[\w]
diperlukan oleh POSIX untuk mencocokkan backslash atau w
. Jadi Anda tidak akan menemukan grep
atau sed
implementasi di mana itu tersedia (kecuali melalui opsi non-standar).
Perilaku untuk \w
sendiri tidak ditentukan oleh POSIX, jadi implementasi diperbolehkan untuk melakukan apa yang mereka inginkan. GNU grep
menambahkan itu sejak lama.
GNU grep
digunakan untuk memiliki mesin regexp sendiri namun sekarang menggunakan GNU libc's (meskipun ia menanamkan salinannya sendiri).
Ini dimaksudkan untuk mencocokkan alnums dan garis bawah di lokal Anda. Namun, saat ini memiliki bug karena hanya cocok dengan karakter byte tunggal (misalnya, tidak é di lokal UTF-8 meskipun itu jelas huruf dan meskipun itu cocok dengan é di semua lokal tempat é adalah satu karakter).
Ada juga \w
operator regexp di perl regexp dan di PCRE. PCRE / perl bukan ekspresi reguler POSIX, mereka hanya hal lain sama sekali.
Sekarang, dengan cara GNU grep -P
menggunakan PCRE, ia memiliki masalah yang sama seperti tanpa -P
. Itu dapat dikerjakan di sana dengan menggunakan (*UCP)
(meskipun itu juga memiliki efek samping di lokal non-UTF8).
GNU sed
juga menggunakan regex libc GNU untuk regexpsnya sendiri. Ia menggunakannya sedemikian rupa sehingga tidak memiliki bug yang sama dengan GNU grep
.
GNU sed
tidak mendukung PCRE. Ada beberapa bukti dalam kode yang telah dicoba sebelumnya, tetapi tampaknya tidak ada dalam agenda lagi.
Jika Anda ingin ekspresi reguler Perl, gunakan saja perl
.
Kalau tidak, saya akan mengatakan bahwa daripada mencoba mengandalkan fitur non-standar palsu dari implementasi khusus Anda sed
/ grep
, akan lebih baik untuk tetap dengan standar dan penggunaan [_[:alnum:]]
.
[_[:alnum:]]
adalah solusi yang bagus yang memungkinkan saya untuk memperpanjang seperti[\w/]
([_[:alnum:]/]
dalam hal ini).