İçindekiler
Birisi araç kutusunu düzenli ifadelerle zenginleştirebilseydi Excel'in ne kadar güçlü olacağını hiç düşündünüz mü? Sadece düşünmekle kalmadık, üzerinde çalıştık :) Ve şimdi, bu harika RegEx işlevini kendi çalışma kitaplarınıza ekleyebilir ve bir desenle eşleşen alt dizeleri anında silebilirsiniz!
Geçen hafta, Excel'de dizeleri değiştirmek için düzenli ifadelerin nasıl kullanılacağına baktık. Bunun için özel bir Regex Replace işlevi oluşturduk. Görünüşe göre, işlev birincil kullanımının ötesine geçiyor ve yalnızca dizeleri değiştirmekle kalmıyor, aynı zamanda onları kaldırabiliyor. Bu nasıl olabilir? Excel açısından, bir değeri kaldırmak, onu boş bir dizeyle değiştirmekten başka bir şey değildir, bu da Regex işlevimizinçok iyi!
Excel'de alt dizeleri kaldırmak için VBA RegExp işlevi
Hepimizin bildiği gibi, düzenli ifadeler Excel'de varsayılan olarak desteklenmez. Bunları etkinleştirmek için kendi kullanıcı tanımlı işlevinizi oluşturmanız gerekir. İyi haber şu ki, böyle bir işlev zaten yazılmış, test edilmiş ve kullanıma hazır. Tek yapmanız gereken bu kodu kopyalamak, VBA düzenleyicinize yapıştırmak ve ardından dosyanızı makro özellikli çalışma kitabı (.xlsm).
Fonksiyon aşağıdaki sözdizimine sahiptir:
RegExpReplace(text, pattern, replacement, [instance_num], [match_case])İlk üç bağımsız değişken gereklidir, son ikisi isteğe bağlıdır.
Nerede?
- Metin - içinde arama yapılacak metin dizesi.
- Desen - aranacak düzenli ifade.
- Değiştirme - ile değiştirilecek metin. için alt dizeleri kaldır desenle eşleşiyorsa, bir boş dize ("") değiştirilmesi için.
- Instance_num (isteğe bağlı) - değiştirilecek örnek. atlanırsa, bulunan tüm eşleşmeler değiştirilir (varsayılan).
- Match_case (isteğe bağlı) - metin büyük/küçük harfinin eşleştirilip eşleştirilmeyeceğini belirten bir Boolean değeri. Büyük/küçük harfe duyarlı eşleştirme için TRUE (varsayılan); büyük/küçük harfe duyarsız için FALSE kullanın.
Daha fazla bilgi için lütfen RegExpReplace işlevine bakın.
İpucu: Basit durumlarda, Excel formülleri ile hücrelerden belirli karakterleri veya kelimeleri kaldırabilirsiniz. Ancak düzenli ifadeler bunun için çok daha fazla seçenek sunar.
Düzenli ifadeler kullanarak dizeler nasıl kaldırılır - örnekler
Yukarıda belirtildiği gibi, bir desenle eşleşen metin parçalarını kaldırmak için bunları boş bir dizeyle değiştirmeniz gerekir. Dolayısıyla, genel bir formül bu şekli alır:
RegExpReplace(text, pattern, "", [instance_num], [match_case])Aşağıdaki örnekler bu temel kavramın çeşitli uygulamalarını göstermektedir.
Tüm eşleşmeleri veya belirli bir eşleşmeyi kaldırın
RegExpReplace işlevi, belirli bir regex ile eşleşen tüm alt dizeleri bulmak için tasarlanmıştır. Hangi oluşumların kaldırılacağı, 4. isteğe bağlı bağımsız değişken tarafından kontrol edilir instance_num .
Varsayılan değer "tüm eşleşmeler "dir - ne zaman instance_num argümanı atlanırsa, bulunan tüm eşleşmeler kaldırılır. Belirli bir eşleşmeyi silmek için örnek numarasını tanımlayın.
Aşağıdaki dizelerde, ilk sıra numarasını silmek istediğinizi varsayalım. Bu tür numaraların tümü hash işareti (#) ile başlar ve tam olarak 5 basamak içerir. Dolayısıyla, bu regex'i kullanarak bunları tanımlayabiliriz:
Desen : #\d{5}\b
Kelime sınırı \b, eşleşen bir alt dizenin #10000001 gibi daha büyük bir dizenin parçası olamayacağını belirtir.
Tüm eşleşmeleri kaldırmak için instance_num argümanı tanımlanmamıştır:
=RegExpReplace(A5, "#\d{5}\b", "")
Yalnızca ilk oluşumu ortadan kaldırmak için instance_num argümanı 1'e:
=RegExpReplace(A5, "#\d{5}\b", "", 1)
Belirli karakterleri kaldırmak için regex
Bir dizeden belirli karakterleri çıkarmak için, istenmeyen tüm karakterleri yazın ve bunları dikey bir çubukla ayırın
Örneğin, çeşitli formatlarda yazılmış telefon numaralarını standartlaştırmak için önce parantez, tire, nokta ve boşluk gibi belirli karakterlerden kurtuluruz.
Desen : \(
=RegExpReplace(A5, "\(
Bu işlemin sonucu "1234567890" gibi 10 basamaklı bir sayıdır.
Kolaylık sağlamak için, regex'i ayrı bir hücreye girebilir ve $A$2 gibi mutlak bir referans kullanarak bu hücreye başvurabilirsiniz:
=RegExpReplace(A5, $A$2, "")
Ardından, birleştirme operatörünü (&) ve SAĞ, ORTA ve SOL gibi Metin işlevlerini kullanarak biçimlendirmeyi istediğiniz şekilde standartlaştırabilirsiniz.
Örneğin, tüm telefon numaralarını (123) 456-7890 biçiminde yazmak için formül şöyledir:
="("&LEFT(B5, 3)&") "&MID(B5, 4, 3)&"-"&RIGHT(B5, 4)
Burada B5, RegExpReplace işlevinin çıktısıdır.
Regex kullanarak özel karakterleri kaldırma
Eğitimlerimizden birinde, dahili ve özel işlevleri kullanarak Excel'de istenmeyen karakterlerin nasıl kaldırılacağını inceledik. Düzenli ifadeler işleri çok daha kolay hale getirir! Silinecek tüm karakterleri listelemek yerine, sadece saklamak istediklerinizi belirtin :)
Desen aşağıdakilere dayanmaktadır olumsuzlanmış karakter sınıfları - parantez içinde OLMAYAN herhangi bir tek karakterle eşleştirmek için [^ ] karakter sınıfının içine bir işaret konur. + niceleyicisi, ardışık karakterleri tek bir eşleşme olarak görmeye zorlar, böylece her bir karakter yerine eşleşen bir alt dize için bir değiştirme yapılır.
İhtiyaçlarınıza bağlı olarak, aşağıdaki regex'lerden birini seçin.
Kaldırmak için alfanümerik olmayan karakterler, yani harfler ve rakamlar hariç tüm karakterler:
Desen : [^0-9a-zA-Z]+
Tüm karakterleri temizlemek için harfler hariç , rakamlar ve boşluklar :
Desen : [^0-9a-zA-Z ]+
Tüm karakterleri silmek için harfler hariç , rakamlar ve alt çizgi alfanümerik karakter veya alt çizgi OLMAYAN herhangi bir karakter anlamına gelen \W kullanabilirsiniz:
Desen : \W+
Eğer istiyorsan diğer bazı karakterler kalsın örneğin noktalama işaretleri, bunları parantezlerin içine koyun.
Örneğin, harf, rakam, nokta, virgül veya boşluk dışındaki herhangi bir karakteri çıkarmak için aşağıdaki regex'i kullanın:
Desen : [^0-9a-zA-Z\., ]+
Bu, tüm özel karakterleri başarıyla ortadan kaldırır, ancak fazladan boşluk kalır.
Bunu düzeltmek için, yukarıdaki işlevi birden fazla boşluğu tek bir boşluk karakteriyle değiştiren başka bir işlevin içine yerleştirebilirsiniz.
=RegExpReplace(RegExpReplace(A5,$A$2,""), " +", "")
Ya da sadece aynı etkiye sahip yerel TRIM işlevini kullanın:
=TRIM(RegExpReplace(A5, $A$2, ""))
Sayısal olmayan karakterleri kaldırmak için regex
Bir dizeden sayısal olmayan tüm karakterleri silmek için bu uzun formülü ya da aşağıda listelenen çok basit regex'lerden birini kullanabilirsiniz.
Rakam OLMAYAN herhangi bir karakteri eşleştirin:
Desen : \D+
Negatif sınıfları kullanarak sayısal olmayan karakterleri soyun:
Desen : [^0-9]+
Desen : [^\d]+
İpucu: Amacınız metni kaldırmak ve kalan sayıları ayrı hücrelere dökmek veya hepsini belirli bir sınırlayıcıyla ayrılmış olarak tek bir hücreye yerleştirmekse, düzenli ifadeler kullanarak dizeden sayıları ayıklama bölümünde açıklandığı gibi RegExpExtract işlevini kullanın.
Boşluktan sonraki her şeyi kaldırmak için regex
Bir boşluktan sonraki her şeyi silmek için, ilk boşluğu bulmak üzere boşluk ( ) veya beyaz boşluk (\s) karakterini ve ondan sonraki tüm karakterleri eşleştirmek için .* karakterini kullanın.
Yalnızca normal boşluklar (7 bit ASCII sisteminde 32 değeri) içeren tek satırlı dizeleriniz varsa, aşağıdaki regex'lerden hangisini kullandığınız gerçekten önemli değildir. Çok satırlı dizeler söz konusu olduğunda, bir fark yaratır.
Her şeyi kaldırmak için boşluk karakterinden sonra bu regex'i kullanın:
Desen : " .*"
=RegExpReplace(A5, " .*", "")
Bu formül, ilk boşluktan sonraki her şeyi her satır Sonuçların doğru görüntülenmesi için Metni Kaydır seçeneğini açtığınızdan emin olun.
Her şeyi soymak için boşluktan sonra (boşluk, sekme, satır başı ve yeni satır dahil), regex şöyledir:
Desen : \s.*
=RegExpReplace(A5, "\s.*", "")
Çünkü \s, aşağıdakiler de dahil olmak üzere birkaç farklı beyaz boşluk türüyle eşleşir yeni bir hat (\n), bu formül, içinde kaç satır olursa olsun, bir hücredeki ilk boşluktan sonraki her şeyi siler.
Belirli karakterden sonra metni kaldırmak için regex
Önceki örnekteki yöntemleri kullanarak, belirttiğiniz herhangi bir karakterden sonraki metni silebilirsiniz.
Her bir satırı ayrı ayrı ele almak için:
Jenerik desen : char.*
Tek satırlı dizelerde, bu, aşağıdakilerden sonra gelen her şeyi kaldıracaktır char Çok satırlı dizelerde, her satır ayrı ayrı işlenecektir çünkü VBA Regex aromasında, nokta (.) yeni bir satır dışındaki herhangi bir karakterle eşleşir.
Tüm satırları tek bir dize olarak işlemek için:
Jenerik desen : char(.
Yeni satırlar da dahil olmak üzere belirli bir karakterden sonraki her şeyi silmek için desene \n eklenir.
Örneğin, bir dizede ilk virgülden sonraki metni kaldırmak için şu düzenli ifadeleri deneyin:
Desen : ,.*
Desen : ,(.
Aşağıdaki ekran görüntüsünde sonuçların nasıl farklılaştığını inceleyebilirsiniz.
Boşluktan önceki her şeyi kaldırmak için regex
Uzun metin dizeleriyle çalışırken, bazen tüm hücrelerdeki aynı bilgi bölümünü kaldırarak bunları daha kısa hale getirmek isteyebilirsiniz. Aşağıda bu tür iki durumu ele alacağız.
Son boşluktan önceki her şeyi kaldırın
Önceki örnekte olduğu gibi, bir düzenli ifade "boşluk" anlayışınıza bağlıdır.
Herhangi bir şeyi eşleştirmek için son boşluk bu regex işinizi görecektir (yıldız işaretinden sonraki boşluğu fark edilir kılmak için tırnak işaretleri eklenmiştir).
Desen : ".* "
'den önceki herhangi bir şeyle eşleştirmek için son boşluk (boşluk, sekme, satır başı ve yeni satır dahil), bu düzenli ifadeyi kullanın.
Desen : .*\s
Fark özellikle çok satırlı dizelerde belirgindir.
İlk boşluktan önceki her şeyi soyun
Bir dizedeki ilk boşluğa kadar olan her şeyi eşleştirmek için bu düzenli ifadeyi kullanabilirsiniz:
Desen : ^[^ ]* +
Bir ^ dizesinin başlangıcından itibaren, hemen ardından bir veya daha fazla boşluk " +" gelen sıfır veya daha fazla boşluk olmayan karakterle [^ ]* eşleşiriz. Son kısım, sonuçlarda olası boşlukları önlemek için eklenir.
Her satırdaki ilk boşluktan önceki metni kaldırmak için formül varsayılan "tüm eşleşmeler" modunda yazılır ( instance_num atlanmıştır):
=RegExpReplace(A5, "^[^ ]* +", "")
İlk satırdaki ilk boşluktan önceki metni silmek ve diğer tüm satırları olduğu gibi bırakmak için instance_num argümanı 1 olarak ayarlanır:
=RegExpReplace(A5, "^[^ ]* +", "", 1)
Karakterden önceki her şeyi çıkarmak için regex
Belirli bir karakterden önceki tüm metni kaldırmanın en kolay yolu aşağıdaki gibi bir regex kullanmaktır:
Jenerik desen : ^[^char]*char
İnsan diline çevrildiğinde şöyle der: "^ ile tutturulmuş bir dizenin başlangıcından itibaren, 0 veya daha fazla karakterle eşleşin char [^char]* öğesinin ilk geçtiği yere kadar char .
Örneğin, ilk iki nokta üst üste işaretinden önceki tüm metni silmek için şu düzenli ifadeyi kullanın:
Desen : ^[^:]*:
Sonuçlarda önde gelen boşlukları önlemek için, sonuna bir boşluk karakteri \s* ekleyin. Bu, ilk iki nokta üst üste işaretinden önceki her şeyi kaldıracak ve ondan hemen sonraki boşlukları kırpacaktır:
Desen : ^[^:]*:\s*
=RegExpReplace(A5, "^[^:]*:\s*", "")
İpucu: Normal ifadelerin yanı sıra, Excel'in metni konuma veya eşleşmeye göre kaldırmak için kendi araçları vardır. Görevi yerel formüllerle nasıl gerçekleştireceğinizi öğrenmek için lütfen Excel'de bir karakterden önce veya sonra metin kaldırma bölümüne bakın.
Dışındaki her şeyi kaldırmak için regex
Bir dizeden saklamak istedikleriniz dışındaki tüm karakterleri silmek için olumsuz karakter sınıflarını kullanın.
Örneğin, küçük harfler ve noktalar dışındaki tüm karakterleri kaldırmak için regex şu şekildedir:
Desen : [^a-z\.]+
Aslında, fonksiyonumuz bulunan tüm eşleşmeleri değiştirdiği için burada + niceleyici olmadan da yapabiliriz. Niceleyici sadece biraz daha hızlı olmasını sağlar - her bir karakteri tek tek işlemek yerine, bir alt dizeyi değiştirirsiniz.
=RegExpReplace(A5, "[^a-z\.]+", "")
Excel'de html etiketlerini kaldırmak için regex
Öncelikle, HTML'nin düzenli bir dil olmadığını, bu nedenle düzenli ifadeler kullanarak ayrıştırmanın en iyi yol olmadığını belirtmek gerekir. Bununla birlikte, regex'ler veri kümenizi daha temiz hale getirmek için hücrelerinizden etiketleri çıkarmaya kesinlikle yardımcı olabilir.
Html etiketlerinin her zaman köşeli parantezler içine yerleştirildiği göz önüne alındığında, bunları aşağıdaki regex'lerden birini kullanarak bulabilirsiniz.
Negatif sınıf:
Desen : ]*>
Burada, bir açılış köşeli parantezini ve ardından en yakın kapanış köşeli parantezine kadar kapanış köşeli parantezi [^>]* dışında herhangi bir karakterin sıfır veya daha fazla oluşumunu eşleştiririz.
Tembel arama:
Desen :
Burada, ilk açılış parantezinden ilk kapanış parantezine kadar olan her şeyi eşleştiririz. Soru işareti, .*'i bir kapanış parantezi bulana kadar mümkün olduğunca az karakterle eşleşmeye zorlar.
Hangi deseni seçerseniz seçin, sonuç kesinlikle aynı olacaktır.
Örneğin, A5'teki bir dizeden tüm html etiketlerini kaldırmak ve metni bırakmak için formül şöyledir:
=RegExpReplace(A5, "]*>", "")
Ya da ekran görüntüsünde gösterildiği gibi tembel niceleyiciyi kullanabilirsiniz:
Bu çözüm tek metin için mükemmel çalışır (satır 5 - 9). Birden fazla metin için (satır 10 - 12), sonuçlar sorgulanabilir - farklı etiketlerden metinler bir araya getirilir. Bu doğru mu değil mi? Korkarım, bu kolayca karar verilebilecek bir şey değil - her şey istediğiniz sonucu anlamanıza bağlı. Örneğin, B11'de "A1" sonucu beklenirken; B10'da şunları isteyebilirsiniz"data1" ve "data2" boşluk ile ayrılmalıdır.
Html etiketlerini kaldırmak ve kalan metinleri boşluklarla ayırmak için bu şekilde ilerleyebilirsiniz:
- Etiketleri boş dizelerle değil, boşluklarla " " değiştirin:
=RegExpReplace(A5, "]*>", " ")
- Birden fazla boşluğu tek bir boşluk karakterine indirgeyin:
=RegExpReplace(RegExpReplace(A5, "]*>", " "), " +", " ")
- Baştaki ve sondaki boşlukları kırpın:
=TRIM(RegExpReplace(RegExpReplace(A5, "]*>", " "), " +", " "))
Sonuç şuna benzer bir şey olacaktır:
Ablebits Regex Kaldırma Aracı
Excel için Ultimate Suite'imizi kullanma şansınız olduysa, muhtemelen son sürümle birlikte sunulan yeni Regex Araçlarını zaten keşfetmişsinizdir. Bu .NET tabanlı Regex işlevlerinin güzelliği, öncelikle VBA RegExp sınırlamaları olmaksızın tam özellikli düzenli ifade sözdizimini desteklemeleri ve ikinci olarak, tüm kod entegrasyonu yapıldığı için çalışma kitaplarınıza herhangi bir VBA kodu eklemeyi gerektirmemeleridirarka uçta bizim tarafımızdan.
Size düşen düzenli bir ifade oluşturmak ve bunu işleve sunmak :) Bunu nasıl yapacağınızı pratik bir örnek üzerinde göstereyim.
Regex kullanarak parantez ve parantez içindeki metin nasıl kaldırılır
Uzun metin dizelerinde, daha az önemli bilgiler genellikle [parantez] ve (parantez) içine alınır. Diğer tüm verileri koruyarak bu alakasız ayrıntıları nasıl kaldırırsınız?
Aslında, html etiketlerini, yani köşeli parantezler içindeki metni silmek için benzer bir regex oluşturduk. Açıkçası, aynı yöntemler köşeli ve yuvarlak parantezler için de işe yarayacaktır.
Desen : (\(.*?\))
İşin püf noktası, mümkün olan en kısa alt dizeyi eşleştirmek için tembel bir niceleyici (*?) kullanmaktır. İlk grup (\(.*?\)), bir açılış parantezinden ilk kapanış parantezine kadar her şeyle eşleşir. İkinci grup (\[.*?\]), bir açılış parantezinden ilk kapanış parantezine kadar her şeyle eşleşir. Dikey bir çubuk
Desen belirlendikten sonra, onu Regex Remove fonksiyonumuza "besleyelim." İşte nasıl yapılacağı:
- Üzerinde Ablebits Verileri sekmesinde Metin grubunu seçin, tıklayın Regex Araçları .
Sonuçları değer olarak değil formül olarak almak için Formül olarak ekle onay kutusu.
A2:A5'teki dizelerden parantez içindeki metni kaldırmak için ayarları aşağıdaki gibi yapılandırıyoruz:
Sonuç olarak AblebitsRegexRemove işlevi orijinal verilerinizin yanındaki yeni bir sütuna eklenir.
İşlev ayrıca standart olarak bir hücreye doğrudan girilebilir Fonksiyon Ekleme altında kategorize edildiği iletişim kutusu AblebitsUDF'ler .
As AblebitsRegexRemove metni kaldırmak için tasarlanmıştır, yalnızca iki bağımsız değişken gerektirir - kaynak dize ve regex. Her iki parametre de doğrudan bir formülde tanımlanabilir veya hücre başvuruları biçiminde sağlanabilir. Gerekirse, bu özel işlev herhangi bir yerel işlevle birlikte kullanılabilir.
Örneğin, sonuç dizelerindeki fazladan boşlukları kırpmak için TRIM işlevini bir sarmalayıcı olarak kullanabilirsiniz:
=TRIM(AblebitsRegexRemove(A5, $A$2))
Düzenli ifadeleri kullanarak Excel'de dizeleri nasıl kaldıracağınızı anlattım. Okuduğunuz için teşekkür ediyor ve gelecek hafta sizi blogumuzda görmeyi dört gözle bekliyorum!
Mevcut indirmeler
Regex kullanarak dizeleri kaldırma - örnekler (.xlsm dosyası)
Ultimate Suite - deneme sürümü (.exe dosyası)