Mencocokkan karakter khusus dengan Ekspresi Reguler

10

Katakan itu sangat mudah jika saya ingin menemukan sesuatu yang mengandung huruf kecil dan angka

menghasilkan_text | grep -E '[0-9a-z]'

Kurung berguna untuk mencocokkan serangkaian karakter, tetapi bagaimana dengan karakter yang agak spesial?
Jika saya ingin, menggunakan tanda kurung, cocok dengan karakter apa pun kecuali salah satu dari ini: braket penutup ], tanda hubung (atau tanda hubung) "-", baik garis miring /dan \, tanda garis , tanda ^titik dua :.
Apakah akan terlihat seperti ini (saya tahu ini tidak berhasil)?

[^] - / \ ^:]
iBug
sumber

Jawaban:

11

Untuk mencocokkan literal ]dan literal -dalam Ekspresi Bracket Anda harus menggunakannya seperti ini:

[^]/\^:-]

atau, bahkan lebih baik, karena beberapa alat memerlukan backslash untuk melarikan diri :

[^]/\\^:-]

yaitu
kurung siku-kanan (']') akan kehilangan makna khusus dan mewakili dirinya dalam ekspresi kurung jika terjadi pertama dalam daftar (setelah inisial '^', jika ada)
dan
karakter minus-tanda harus diperlakukan sebagai dirinya sendiri jika itu terjadi pertama (setelah inisial '^', jika ada) atau terakhir dalam daftar
maka
Jika ekspresi kurung menentukan '-' dan ']', maka ']' harus ditempatkan terlebih dahulu (setelah '^', jika ada) dan '-' terakhir dalam ekspresi braket.
Aturan untuk ekspresi braket sama untuk ERE dan BRE .

don_crissti
sumber
2
Saya akan menggandakan backslash untuk berada di sisi yang aman. Ini diperlukan dengan banyak awkimplementasi dan perlmisalnya.
Stéphane Chazelas
Bagaimana dengan "Dari caret ke bracket penutup"? Suka [^-]](Yang ini gagal)?
iBug
2
@ iBug - pasti gagal karena braket yang tepat harus menjadi yang pertama jika Anda ingin mencocokkannya secara harfiah. Saya tidak yakin saya mendapatkan poin dari "rentang" yang Anda sebutkan ^setelah ]jadi [^-]]tidak akan bekerja bahkan jika keduanya ^dan ]diperlakukan secara harfiah (seperti [b-a]). Ngomong-ngomong, jika Anda ingin mencocokkan dari mis ;hingga menutup braket, Anda bisa menggunakan rentang hingga char sebelumnya ](yang merupakan backslash) dan memasukkan ]sebagai char pertama dalam ekspresi braket jadi mis [];-\\].
don_crissti
@don_crissti Bagaimana [[.^.]-[.-.]]? Saya merasa ini akan berhasil. Mari kita asumsikan bahwa kode ASCII ^sebelumnya -.
iBug
Ada solusi malas untuk pertanyaan saya. Cukup dapatkan semuanya yang spesial untuk menyusun karakter, seperti[^[.].][.-.]/\^:]
iBug
7

Mungkin anehnya, Anda perlu memiliki beberapa karakter di tempat-tempat tertentu. Anda harus memiliki ]karakter pertama dalam set, dan -harus menjadi karakter terakhir dalam set.

Berikut adalah RE yang memenuhi persyaratan Anda [^]\^/-]::

echo 'Hello[world]-[sun] ^^ 4/5 or 3\4' | grep -Eo '[^]\^/-]' | xargs
H e l l o [ w o r l d [ s u n 4 5 o r 3 4
roaima
sumber
1
Ini tidak benar-benar aneh, hanya perlu untuk menghindari ambiguitas
Kevin
1
[Karakter kedua tidak termasuk di sana; OP tidak ingin mengecualikannya.
Scott
@Scott terlihat dengan baik, terima kasih. Jawaban diperbarui.
roaima