Di mana regex pencarian didukung dan di mana tidak?

Mencoba meningkatkan keterampilan regex saya, saya ingin belajar tentang ekspresi melihat ke depan dan melihat ke belakang. Di sistem Archlinux saya, saya mencoba yang berikut:

a=ab;if [[ $a =~ [a-z](?=b) ]]; then echo "Y";else echo "N";fi

Yang, sejauh yang saya pahami, seharusnya cocok dan menggemakan "Y", tetapi tidak.

echo ab |sed 's/[a-z](?=b)/x/'

... juga sepertinya tidak cocok. grep tampaknya juga tidak melihat-lihat, tetapi pcregrep melihatnya. Saya juga mencoba beberapa kali mencoba mengutip dan/atau menghindari ekspresi, tetapi tidak berhasil.

Aku sedikit bingung sekarang. Bisakah seseorang menjelaskan di mana pencarian, yang tampaknya itu eksotis jika dilihat dari jumlah penyebutan dalam tutorial, sebenarnya dapat digunakan? Atau apakah aku hanya mengacaukan ekspresiku?


person some-non-descript-user    schedule 27.12.2015    source sumber
comment
Saya akan merekomendasikan Menguasai Ekspresi Reguler, oleh Jeffrey E. F. Friedl; ini adalah referensi regex dasar saya. Saya juga menggunakan (regular-expressions.info) dan (rexegg.com) sebagai referensi online, dan (regex101.com) atau (regexr.com) sebagai penguji langsung untuk eksperimen. Mereka mungkin berguna bagi Anda.   -  person rivy    schedule 28.12.2015


Jawaban (2)


Pernyataan pencarian tidak didukung oleh ekspresi reguler posix dasar atau diperpanjang yang tersedia di bash atau sed.

Alat yang bagus untuk diuji adalah GNU grep yang mendukung opsi -P untuk ekspresi reguler yang kompatibel dengan Perl. Seperti ini:

grep --color=auto -P '[a-z](?=b)' <<< 'ab'

Sumber daya yang lebih baik lagi adalah alat pengujian regex online seperti https://regex101.com/

person hek2mgl    schedule 27.12.2015
comment
Jadi pencarian pada dasarnya lebih merupakan fitur Perl-Regex? - person some-non-descript-user; 27.12.2015
comment
@some-non-descript-user lebih tepat mengatakan bahwa Perl mendukung pencarian. - person Maroun; 27.12.2015
comment
@some-non-descript-user Ada juga mesin regex lain yang mendukung pencarian seperti Java, .NET, python dll. Namun, ekspresi reguler POSIX tidak mendukung pencarian. - person hek2mgl; 27.12.2015

Anda harus membedakan antara Ekspresi Reguler dasar dan diperluas.

Dalam ekspresi reguler dasar, karakter meta ?, +, {, |, (, dan ) kehilangan arti khususnya; Mereka harus di-escape untuk mendapatkan arti "regex" mereka.

Sebaliknya, dalam Ekspresi Reguler diperluas, karakter-karakter ini mendapatkan arti "regex".

Jika Anda grep --help, Anda akan mendapatkan:

-E, --extended-regexp POLA adalah ekspresi reguler yang diperluas (ERE)

Perhatikan bahwa grep tidak mendukung pencarian, namun didukung di pcregrep.

person Maroun    schedule 27.12.2015
comment
Terima kasih atas pemberitahuan tentang regex yang diperluas. - person some-non-descript-user; 27.12.2015