Bagaimana saya bisa menggunakan ekspresi reguler di Excel dan memanfaatkan setup seperti grid Excel yang kuat untuk manipulasi data?
- Fungsi dalam sel untuk mengembalikan pola yang cocok atau nilai yang diganti dalam string.
- Sub untuk loop melalui kolom data dan mengekstrak kecocokan ke sel yang berdekatan.
- Pengaturan apa yang diperlukan?
- Apa karakter khusus Excel untuk ekspresi reguler?
Saya mengerti Regex tidak ideal untuk banyak situasi ( Untuk penggunaan atau tidak menggunakan kalimat biasa? ) Sejak excel dapat menggunakan Left
, Mid
, Right
, Instr
jenis perintah untuk manipulasi serupa.
Like
operator , yang menyediakan semacam versi ringan dari fungsionalitas gaya regex. Ini biasanya jauh lebih cepat daripada regex, bahkan jika dibungkus dengan sub atau fungsi prosedur.Jawaban:
Ekspresi reguler digunakan untuk Pencocokan Pola.
Untuk digunakan di Excel ikuti langkah-langkah ini:
Langkah 1 : Tambahkan referensi VBA ke "Microsoft VBScript Regular Expressions 5.5"
Langkah 2 : Tentukan pola Anda
Definisi dasar:
-
Jarak.a-z
cocok dengan huruf kecil dari a ke z0-5
cocok dengan angka dari 0 hingga 5[]
Cocokkan persis salah satu objek di dalam kurung ini.[a]
cocok dengan huruf a[abc]
cocok dengan satu huruf yang bisa a, b atau c[a-z]
cocok dengan huruf tunggal alfabet tunggal.()
Kelompokkan pertandingan yang berbeda untuk tujuan pengembalian. Lihat contoh di bawah ini.{}
Pengganda untuk salinan pola berulang yang ditentukan sebelumnya.[a]{2}
cocok dengan dua huruf kecil berturut-turut a:aa
[a]{1,3}
pertandingan setidaknya satu dan sampai tiga huruf kecila
,aa
,aaa
+
Cocokkan setidaknya satu, atau lebih, dari pola yang ditentukan sebelumnya.a+
akan cocok berturut-turut yang inia
,aa
,aaa
, dan sebagainya?
Cocokkan nol atau salah satu pola yang ditentukan sebelumnya.[a-z]?
cocok dengan string kosong atau huruf kecil apa pun.*
Cocokkan nol atau lebih dari pola yang ditentukan sebelumnya. - Misalnya Wildcard untuk pola yang mungkin ada atau tidak ada. - Misalnya[a-z]*
cocok dengan string kosong atau string huruf kecil..
Cocok dengan karakter apa pun kecuali baris baru\n
a.
Mencocokkan string dua karakter yang dimulai dengan a dan berakhir dengan apa pun kecuali\n
|
ATAU operatora|b
artinya bisaa
ataub
bisa dicocokkan.red|white|orange
cocok dengan salah satu warna.^
BUKAN operator[^0-9]
karakter tidak bisa berisi angka[^aA]
karakter tidak boleh huruf kecila
atau huruf besarA
\
Lolos karakter khusus yang mengikuti (menimpa perilaku di atas)\.
,\\
,\(
,\?
,\$
,\^
Pola Penahan:
^
Kecocokan harus terjadi pada awal string^a
Karakter pertama harus huruf kecila
^[0-9]
karakter pertama harus berupa angka.$
Kecocokan harus terjadi pada akhir stringa$
Karakter Terakhir harus huruf kecila
Tabel diutamakan:
Singkatan Karakter Predefined:
Contoh 1 : Jalankan sebagai makro
Contoh makro berikut ini melihat nilai dalam sel
A1
untuk melihat apakah 1 atau 2 karakter pertama adalah digit. Jika demikian, mereka dihapus dan sisa string ditampilkan. Jika tidak, maka sebuah kotak muncul yang memberi tahu Anda bahwa tidak ada kecocokan yang ditemukan.A1
Nilai sel12abc
akan kembaliabc
, nilai1abc
akan kembaliabc
, nilaiabc123
akan kembali "Tidak Cocok" karena digit tidak pada awal string.Contoh 2 : Jalankan sebagai fungsi dalam sel
Contoh ini sama dengan contoh 1 tetapi diatur untuk dijalankan sebagai fungsi dalam sel. Untuk menggunakan, ubah kode menjadi ini:
Tempatkan string Anda ("12abc") di dalam sel
A1
. Masukkan formula ini=simpleCellRegex(A1)
dalam selB1
dan hasilnya akan "abc".Contoh 3 : Lingkaran Melalui Lingkaran
Contoh ini sama dengan contoh 1 tetapi loop melalui berbagai sel.
Contoh 4 : Membagi pola yang berbeda
Contoh ini loop melalui rentang (
A1
,A2
&A3
) dan mencari string yang dimulai dengan tiga digit diikuti oleh karakter alfa tunggal dan kemudian 4 digit angka. Output memisahkan pola yang cocok dengan sel yang berdekatan dengan menggunakan()
.$1
mewakili pola pertama yang cocok dalam set pertama()
.Hasil:
Contoh Pola Tambahan
sumber
Set regEx = Nothing
. Anda akan mendapatkan pengecualian Memori Kehabisan, ketika Sub itu dieksekusi cukup sering.Set regEx = CreateObject("VBScript.RegExp")
ThisWorkbook
. Coba pindahkan kodenya ke yang terpisahModule
.Untuk menggunakan ekspresi reguler secara langsung dalam rumus Excel, UDF berikut (fungsi yang ditentukan pengguna) dapat membantu. Ini kurang lebih secara langsung memperlihatkan fungsi ekspresi reguler sebagai fungsi excel.
Bagaimana itu bekerja
Dibutuhkan 2-3 parameter.
$0
,$1
,$2
, dan sebagainya.$0
adalah seluruh pertandingan,$1
dan naik sesuai dengan grup pertandingan masing-masing dalam ekspresi reguler. Default ke$0
.Beberapa contoh
Mengekstrak alamat email:
Hasil dalam:
[email protected]
Mengekstraksi beberapa substring:
Hasil dalam:
E-Mail: [email protected], Name: Peter Gordon
Untuk memisahkan string gabungan dalam satu sel ke dalam komponennya dalam banyak sel:
Hasil dalam:
Peter Gordon
[email protected]
...Cara Penggunaan
Untuk menggunakan UDF ini lakukan hal berikut (kira-kira berdasarkan halaman Microsoft ini . Mereka memiliki beberapa info tambahan yang bagus di sana!):
ALT+F11
untuk membuka Microsoft Visual Basic for Applications Editor.Klik pada Insert Module . Jika Anda memberi nama yang berbeda pada modul Anda, pastikan Modul tidak memiliki nama yang sama dengan UDF di bawah ini (mis. Menamai Modul
Regex
dan fungsinyaregex
menyebabkan kesalahan #NAME! ).Di jendela teks besar di tengah masukkan yang berikut:
Simpan dan tutup jendela Editor Visual Microsoft untuk Aplikasi .
sumber
Function foo() As Variant \n foo="Hello World" \n End Function
UDF minimal untuk melihat apakah itu berhasil. Jika ya, lanjutkan dengan cara penuh di atas, jika tidak ada sesuatu yang dasar rusak (makro dinonaktifkan?)Memperluas pada patszim 's jawaban bagi mereka terburu-buru.
tambahkan kode berikut:
Pola regex ditempatkan di salah satu sel dan referensi absolut digunakan di atasnya. Fungsi akan diikat ke buku kerja yang dibuat.
Jika ada kebutuhan untuk digunakan dalam buku kerja yang berbeda, simpan fungsi di Personal.XLSB
sumber
Ini usaha saya:
sumber
Saya perlu menggunakan ini sebagai fungsi sel (suka
SUM
atauVLOOKUP
) dan menemukan bahwa itu mudah:Buat fungsi berikut di buku kerja atau di modul sendiri:
Kemudian Anda dapat menggunakan sel dengan
=REGPLACE(B1, "(\w) (\d+)", "$1$2")
(mis: "A 243" hingga "A243")sumber
Ini bukan jawaban langsung tetapi dapat memberikan alternatif yang lebih efisien untuk pertimbangan Anda. Google Sheets memiliki beberapa fungsi Regex bawaan, ini bisa sangat nyaman dan membantu menghindari beberapa prosedur teknis di Excel. Jelas ada beberapa keuntungan menggunakan Excel di PC Anda, tetapi untuk sebagian besar pengguna Google Sheets akan menawarkan pengalaman yang sama dan mungkin menawarkan beberapa manfaat dalam portabilitas dan berbagi dokumen.
Mereka menawarkan
REGEXEXTRACT: Ekstrak substring yang cocok sesuai dengan ekspresi reguler.
REGEXREPLACE: Mengganti bagian dari string teks dengan string teks yang berbeda menggunakan ekspresi reguler.
SUBSTITUTE: Mengganti teks yang ada dengan teks baru dalam sebuah string.
REPLACE: Mengganti bagian dari string teks dengan string teks yang berbeda.
Anda dapat mengetik ini langsung ke sel seperti itu dan akan menghasilkan apa pun yang Anda inginkan
Mereka juga bekerja sangat baik dalam kombinasi dengan fungsi-fungsi lain seperti pernyataan IF seperti:
Semoga ini memberikan solusi sederhana bagi pengguna yang merasa diejek oleh komponen VBS Excel.
sumber
Berikut ini
regex_subst()
fungsinya. Contoh:Berikut adalah kode yang disederhanakan (toh, lebih sederhana untuk saya). Saya tidak tahu bagaimana membangun pola keluaran yang cocok menggunakan cara di atas untuk bekerja seperti contoh saya:
sumber
Saya tidak ingin harus mengaktifkan pustaka referensi karena saya perlu skrip saya menjadi portabel. The
Dim foo As New VBScript_RegExp_55.RegExp
garis disebabkanUser Defined Type Not Defined
kesalahan, tapi saya menemukan solusi yang bekerja untuk saya.Yang ingin Anda lakukan adalah memasukkan contoh string ke dalam sel
A1
, lalu mengujistrPattern
. Setelah itu berfungsi sesuaikan kemudianrng
seperti yang diinginkan.sumber
VBScript_RegExp_55
perpustakaan cukup banyak di mana-mana sehingga membawa risiko yang sangat rendah tidak berada pada mesin target tertentu. Lagi pula, beralih dari Early Bound ke Late Bound tidak menyelesaikan masalah portabilitas (kode masih akan error, hanya pada saat run daripada waktu kompilasi)Untuk menambah konten yang berharga, saya ingin membuat pengingat ini tentang mengapa kadang-kadang RegEx dalam VBA tidak ideal. Tidak semua ekspresi didukung, tetapi sebaliknya dapat melempar
Error 5017
dan dapat membiarkan tebakan penulis (yang saya korban dari diri saya sendiri).Meskipun kami dapat menemukan beberapa sumber tentang apa yang didukung, akan sangat membantu untuk mengetahui karakter metak dll yang tidak didukung. Penjelasan yang lebih mendalam dapat ditemukan di sini . Disebutkan dalam sumber ini:
Jadi, yang tidak didukung adalah:
\A
, atau gunakan^
tanda sisipan untuk mencocokkan posisi sebelum karakter pertama dalam string\Z
, gunakan$
tanda dolar untuk mencocokkan posisi setelah karakter terakhir(?<=a)b
(sementara LookAhead postive yang didukung)(?<!a)b
(sementara LookAhead negatif yang didukung)\{uFFFF}
/i
(sensitivitas huruf) atau/g
(global) dll. Atur ini melaluiRegExp
properti objek>RegExp.Global = True
danRegExp.IgnoreCase = True
jika tersedia.'
komentar reguler dalam skripSaya sudah menabrak dinding lebih dari sekali menggunakan ekspresi reguler dalam VBA. Biasanya dengan
LookBehind
tapi kadang-kadang saya bahkan lupa pengubah. Saya belum mengalami sendiri semua latar belakang yang disebutkan di atas, tetapi saya pikir saya akan mencoba untuk lebih luas merujuk pada beberapa informasi yang lebih mendalam. Jangan ragu untuk berkomentar / memperbaiki / menambah. Teriakan besar untuk regular-expressions.info untuk banyak informasi.PS Anda telah menyebutkan metode dan fungsi VBA biasa, dan saya dapat mengonfirmasi bahwa mereka (setidaknya untuk diri saya sendiri) telah membantu dengan cara mereka sendiri di mana RegEx akan gagal.
sumber