Excel Regex: düzenli ifadeleri kullanarak dizeleri eşleştirme

  • Bunu Paylaş
Michael Brown

Bu eğitimde, Excel'de dizeleri eşleştirmek için regex'in nasıl kullanılacağına derinlemesine bakacağız.

Bir hücre aralığında belirli bir değeri bulmanız gerektiğinde, MATCH veya XMATCH işlevini kullanırsınız. Bir hücrede belirli bir dizeyi ararken, FIND ve SEARCH işlevleri kullanışlı olur. Peki bir hücrenin belirli bir kalıpla eşleşen bilgiler içerip içermediğini nasıl anlarsınız? Açıkçası, düzenli ifadeler kullanarak. Ancak Excel kutudan çıktığında regex'leri desteklemiyor! Endişelenmeyin, desteklemesi için zorlayacağız :)

    Dizeleri eşleştirmek için Excel VBA Regex işlevi

    Başlıktan da anlaşılacağı gibi, Excel'de düzenli ifadeleri kullanmak için kendi işlevinizi oluşturmanız gerekir. Neyse ki, Excel'in VBA'sında dahili bir RegExp nesnesini kodunuzda aşağıda gösterildiği gibi kullanabilirsiniz:

    Public Function RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() As Variant 'sonuçları saklamak için dizi Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'kaynak aralıktaki geçerli satırın indeksi, kaynak aralıktaki geçerli sütunun indeksi, satır sayısı, sütun sayısı On Error GoTo ErrHandlRegExpMatch = arRes Set regex = CreateObject ( "VBScript.RegExp" ) regex.pattern = pattern regex.Global = True regex.MultiLine = True If True = match_case Then regex.ignorecase = False Else regex.ignorecase = True End If cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes(1 To cntInputRows, 1 To cntInputCols) For iInputCurRow = 1 To cntInputRows ForiInputCurCol = 1 To cntInputCols arRes(iInputCurRow, iInputCurCol) = regex.Test(input_range.Cells(iInputCurRow, iInputCurCol).Value) Next Next RegExpMatch = arRes Exit Function ErrHandl: RegExpMatch = CVErr(xlErrValue) End Function

    Kodu VBA düzenleyicisine yapıştırın ve yeni RegExpMatch fonksiyonu kullanıma hazırdır. VBA konusunda çok deneyimli değilseniz, şu kılavuz yardımcı olabilir: Excel'de VBA kodu nasıl eklenir?

    Not: Kodu ekledikten sonra, dosyanızı şu şekilde kaydetmeyi unutmayın makro özellikli çalışma kitabı (.xlsm).

    RegExpMatch sözdizimi

    Bu RegExpMatch işlevi, kaynak dizenin herhangi bir bölümünün bir düzenli ifadeyle eşleşip eşleşmediğini denetler. Sonuç bir Boole değeridir: en az bir eşleşme bulunursa TRUE, aksi takdirde FALSE.

    Özel fonksiyonumuzun 3 argümanı vardır - ilk ikisi gerekli ve sonuncusu isteğe bağlıdır:

    RegExpMatch(metin, desen, [match_case])

    Nerede?

    • Metin (gerekli) - içinde arama yapılacak bir veya daha fazla dizge. Hücre veya aralık referansı olarak sağlanabilir.
    • Desen (gerekli) - eşleştirilecek normal ifade. Doğrudan bir formüle yerleştirildiğinde, desen çift tırnak içine alınmalıdır.
    • Match_case (isteğe bağlı) - eşleşme türünü tanımlar. TRUE ise veya atlanmışsa (varsayılan), büyük/küçük harfe duyarlı eşleştirme gerçekleştirilir; FALSE ise - büyük/küçük harfe duyarsız.

    İşlev, Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 ve Excel 2010'un tüm sürümlerinde çalışır.

    RegExpMatch hakkında bilmeniz gereken 3 şey

    Pratik hesaplamalara geçmeden önce, lütfen bazı teknik hususları açıklığa kavuşturan aşağıdaki noktalara dikkat edin:

    1. Fonksiyon bir tek hücre veya hücre aralığı İkinci durumda, sonuçlar bu örnekte gösterildiği gibi dinamik bir dizi veya yayılma aralığı şeklinde komşu hücrelerde döndürülür.
    2. Varsayılan olarak, işlev büyük/küçük harfe duyarlı Metin büyüklüğünü yok saymak için match_case VBA Regexp sınırlamaları nedeniyle, büyük/küçük harfe duyarlı olmayan desen (?i) desteklenmez.
    3. Geçerli bir kalıp bulunamazsa, işlev FALSE döndürür; eğer desen geçersiz , bir #VALUE! hatası oluşur.

    Aşağıda, tanıtım amacıyla oluşturulmuş birkaç regex eşleştirme örneği bulacaksınız. Kalıplarımızın gerçek çalışma sayfalarınızdaki daha geniş bir girdi verisi yelpazesiyle hatasız çalışacağını garanti edemeyiz. Üretime koymadan önce, örnek kalıplarımızı ihtiyaçlarınıza göre test ettiğinizden ve ayarladığınızdan emin olun.

    Excel'de dizeleri eşleştirmek için regex nasıl kullanılır

    Eşleştirmek istediğiniz tüm dizeler aynı desene sahip olduğunda, düzenli ifadeler ideal bir çözümdür.

    Bazı öğeler hakkında çeşitli ayrıntılar içeren bir hücre aralığınız (A5:A9) olduğunu varsayalım. Hangi hücrelerin SKU'lara sahip olduğunu bilmek istiyorsunuz. Her SKU'nun 2 büyük harf, bir kısa çizgi ve 3 rakamdan oluştuğunu varsayarsak, aşağıdaki ifadeyi kullanarak bunları eşleştirebilirsiniz.

    Desen : \b[A-Z]{2}-\d{3}\b

    Burada [A-Z]{2} A'dan Z'ye kadar herhangi 2 büyük harf ve \d{3} 0'dan 9'a kadar herhangi 3 rakam anlamına gelir. \b karakteri bir kelime sınırını belirtir, yani bir SKU ayrı bir kelimedir ve 23-MAR-2022 gibi daha büyük bir dizenin parçası değildir.

    Kalıp oluşturulduktan sonra formül yazmaya geçebiliriz. Esasen, özel bir işlev kullanmak yerel bir işlevden farklı değildir. Bir formül yazmaya başlar başlamaz, işlevin adı Excel'in Otomatik Tamamlama özelliği tarafından önerilen listede görünecektir. Ancak, Dinamik Dizi Excel (Microsoft 365 ve Excel 2021) ile geleneksel Excel (2019 ve daha eski sürümler) arasında birkaç nüans vardır.

    Dizeyi tek bir hücrede eşleştirme

    Tek bir hücredeki bir dizeyle eşleşmek için, ilk bağımsız değişkende o hücreye bakın. İkinci bağımsız değişkenin bir düzenli ifade içermesi beklenir.

    =RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")

    Desen, mutlak bir referansla ($A$2) kilitlenen önceden tanımlanmış bir hücrede de tutulabilir:

    =RegExpMatch(A5, $A$2)

    Formülü ilk hücreye girdikten sonra, diğer tüm satırlara sürükleyebilirsiniz.

    Bu yöntem şu durumlarda güzel çalışır tüm Excel sürümleri .

    Aynı anda birden çok hücredeki dizeleri eşleştirme

    Birden çok dizeyi tek bir formülle eşleştirmek için, ilk bağımsız değişkene bir aralık başvurusu ekleyin:

    =RegExpMatch(A5:A9, "\b[A-Z]{2}-\d{3}\b")

    İçinde Excel 365 ve Excel 2021 bu şekilde çalışır - formülü ilk hücreye yazarsınız, Enter tuşuna basarsınız ve formül otomatik olarak aşağıdaki hücrelere yayılır.

    İçinde Excel 2019 ve önceki sürümlerde, yalnızca bir hücre aralığına girilen ve Ctrl + Shift + Enter tuşlarına birlikte basılarak tamamlanan geleneksel bir CSE dizi formülü olarak çalışır.

    Numarayla eşleşecek regex

    0'dan 9'a kadar herhangi bir tek rakamı eşleştirmek için \d Özel görevinize bağlı olarak, uygun bir niceleyici ekleyin veya daha karmaşık bir kalıp oluşturun.

    Herhangi bir sayıyla eşleşecek regex

    Herhangi bir uzunluktaki herhangi bir sayıyla eşleşmek için, /d karakterinden hemen sonra + niceleyicisini koyun; bu, 1 veya daha fazla basamak içeren sayıları aramanızı söyler.

    Desen : \d+

    =RegExpMatch(A5:A9, "\d+")

    Belirli uzunluktaki sayıyla eşleşecek regex

    Amacınız belirli sayıda basamak içeren sayısal değerleri eşleştirmekse, uygun bir niceleyici ile birlikte \d kullanın.

    Örneğin, tam olarak 7 basamaktan oluşan fatura numaralarını eşleştirmek için \d{7} kullanırsınız. Ancak, 10 basamaklı veya 100 basamaklı bir sayı da dahil olmak üzere dizenin herhangi bir yerindeki 7 basamakla eşleşeceğini lütfen unutmayın. Aradığınız şey bu değilse, her iki tarafa da \b kelime sınırını koyun.

    Desen : \b\d{7}\b

    =RegExpMatch(A5:A9, "\b\d{7}\b")

    Telefon numaralarını eşleştirmek için regex

    Telefon numaraları çeşitli biçimlerde yazılabildiğinden, bunları eşleştirmek daha karmaşık bir düzenli ifade gerektirir.

    Aşağıdaki veri kümesinde, ilk 2 grupta 3 basamaklı ve son grupta 4 basamaklı olan 10 basamaklı sayıları arayacağız. Gruplar nokta, kısa çizgi veya boşluk ile ayrılabilir. İlk grup parantez içine alınabilir veya alınmayabilir.

    Desen: (\(\d{3}\)

    Bu düzenli ifadeyi parçaladığımızda, işte elde ettiğimiz şey:

    • İlk kısım (\(\d{3}\)
    • \\.\s]? kısmı, köşeli parantez içindeki herhangi bir karakterin 0 veya 1 kez geçmesi anlamına gelir: kısa çizgi, nokta veya boşluk.
    • Ardından, 0 veya 1 kez görünen herhangi bir kısa çizgi, nokta veya boşluk [\-\.\s]? tarafından takip edilen 3 basamaklı bir grup daha d{3} vardır.
    • 4 rakamdan oluşan son grubu \d{4}, bir telefon numarasının daha büyük bir numaranın parçası olamayacağını açıkça belirtmek için bir kelime sınırı \b takip eder.

    A5'teki orijinal dize ve A2'deki düzenli ifade ile formül şu biçimi alır:

    =RegExpMatch(A5, $A$2)

    ... ve tam olarak beklendiği gibi çalışıyor:

    Notlar:

    • Uluslararası kodlar kontrol edilmez, bu nedenle mevcut olabilir veya olmayabilir.
    • Düzenli ifadelerde \s boşluk, sekme, satır başı veya yeni satır gibi herhangi bir boşluk karakteri anlamına gelir. Yalnızca boşluklara izin vermek için [-\.\s] yerine [-\. ] kullanın.
    • Karakterle eşleşmemek için regex

      Belirli bir karakter içermeyen dizeleri bulmak için, parantez içinde DEĞİL olan her şeyle eşleşen olumsuz karakter sınıflarını [^ ] kullanabilirsiniz. Örneğin

      • [13], 1 veya 3 olmayan herhangi bir tek karakterle eşleşecektir.
      • [^1-3] 1, 2 veya 3 olmayan herhangi bir tek karakterle (yani 1'den 3'e kadar herhangi bir rakamla) eşleşecektir.

      Bir telefon numaraları listesinde, ülke kodu olmayanları bulmak istediğinizi varsayalım. Herhangi bir uluslararası kodun + işaretini içerdiğini akılda tutarak, artı işareti içermeyen dizeleri bulmak için [^\+] karakter sınıfını kullanabilirsiniz. Yukarıdaki ifadenin + olmayan herhangi bir tek karakterle eşleştiğini fark etmek önemlidir.mutlaka en başta, sonraki her karakteri kontrol etmek için * niceleyicisi eklenir. Başlangıç ^ ve bitiş $ bağlayıcıları, tüm dizenin işlenmesini sağlar. Sonuç olarak, "dizenin herhangi bir konumundaki + karakteriyle eşleşmeyin" diyen aşağıdaki düzenli ifadeyi elde ederiz.

      Desen : ^[^\+]*$

      =RegExpMatch(A5, "^[^\+]*$")

      Dizeyle eşleşmemek için regex

      Belirli bir dizeyle eşleşmemek için özel bir normal ifade sözdizimi olmasa da, negatif lookahead kullanarak bu davranışı taklit edebilirsiniz.

      Diyelim ki şu dizeleri bulmak istiyorsunuz içermez Bu düzenli ifade işe yarayacaktır:

      Desen : ^((?!limonlar).)*$

      Açıkçası, burada biraz açıklama gerekiyor. Negatif lookahead (?!lemons), ileride "lemons" sözcüğü olup olmadığını görmek için sağa bakar. "lemons" yoksa, nokta satır sonu hariç herhangi bir karakterle eşleşir. Yukarıdaki ifade yalnızca bir kontrol gerçekleştirir ve * niceleyicisi, ^ ile tutturulmuş dizenin başlangıcından ile tutturulmuş dizenin sonuna kadar sıfır veya daha fazla kez tekrarlar.$.

      Metin büyüklüğünü göz ardı etmek için 3. bağımsız değişkeni FALSE olarak ayarlayarak işlevimizi büyük/küçük harfe duyarsız hale getiriyoruz:

      =RegExpMatch(A5, $A$2, FALSE)

      İpuçları ve notlar:

      • Yukarıdaki regex yalnızca tek satır dizeleri. Milti satırlı dizeler söz konusu olduğunda, ^ ve $ karakterleri girdi dizesinin başı ve sonu yerine her satırın başı ve sonuyla eşleşir, bu nedenle regex yalnızca ilk satırda arama yapar.
      • Dizeleri eşleştirmek için Başlamayın belirli bir metin ile , ^(?!lemons).*$ gibi bir düzenli ifade kullanın.
      • Dizeleri eşleştirmek için bitmez belirli bir metin ile son dize çapasını arama desenine dahil edin: ^((?!lemons$).)*$

      Büyük/küçük harfe duyarsız eşleştirme

      Klasik düzenli ifadelerde, VBA RegExp'te desteklenmeyen büyük/küçük harfe duyarlı olmayan eşleştirme (?i) için özel bir kalıp vardır. Bu sınırlamanın üstesinden gelmek için, özel işlevimiz 3. isteğe bağlı bağımsız değişkeni kabul eder match_case . Büyük/küçük harfe duyarlı olmayan eşleştirme yapmak için bunu FALSE olarak ayarlamanız yeterlidir.

      Diyelim ki 1-Mar-22 veya 01-MAR-2022 gibi tarihleri tanımlamak istiyorsunuz. dd-mmm-yyyy ve d-mmm-yy biçimlerinde, aşağıdaki düzenli ifadeyi kullanıyoruz.

      Desen : \b\d{1,2}-(Jan

      İfademiz, 1 veya 2 rakamdan oluşan bir grubu, ardından bir kısa çizgiyi ve ardından aşağıdakilerle ayrılmış ay kısaltmalarından herhangi birini arar

      01-ABC-2020 gibi yanlış pozitif eşleşmeleri önlemek için neden \d{1,2}-[A-Za-z]{3}-\d{2,4}\b gibi daha basit bir kalıp kullanmıyorsunuz?

      Deseni A2'ye girdiğinizde aşağıdaki formülü elde edersiniz:

      =RegExpMatch(A5, $A$2, FALSE)

      Geçerli e-posta adreslerini eşleştirmek için regex

      Genel olarak bilindiği gibi, bir e-posta adresi 4 bölümden oluşur: kullanıcı adı, @ sembolü, alan adı (posta sunucusu) ve üst düzey alan adı (.com, .edu, .org vb. gibi). E-posta adresinin geçerliliğini kontrol etmek için, yukarıdaki yapıyı düzenli ifadeler kullanarak çoğaltmamız gerekir.

      Desen : \b[\w\.\-]+@[A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+\.[A-Za-z]{2,24}\b

      Burada neler olup bittiğini daha iyi anlamak için her bir parçaya daha yakından bakalım:

      • Kullanıcı Adı harfleri, sayıları, alt çizgileri, noktaları ve tire işaretlerini içerebilir. \w'nin herhangi bir harf, rakam veya alt çizgi ile eşleştiğini akılda tutarak aşağıdaki regex'i elde ederiz: [\w\.\-]+
      • Alan adı büyük ve küçük harfler, rakamlar, kısa çizgiler (ancak ilk veya son konumda değil) ve noktalar (alt alan adları durumunda) içerebilir. Alt çizgilere izin verilmediğinden, \w yerine 3 farklı karakter seti kullanıyoruz: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+
      • Üst düzey alan adı Bir nokta ve ardından gelen büyük ve küçük harflerden oluşur. 2 ila 24 harf içerebilir (şu anda var olan en uzun TLD): \.[A-Za-z]{2,24}

      Not: Kalıp, alan adının 2 veya daha fazla alfanümerik karakter içerdiğini varsayar.

      A5'teki orijinal metin ve A5'teki desen ile formül bu şekli alır:

      =RegExpMatch(A5, $A$2)

      Ya da e-posta doğrulaması için küçük veya büyük harf karakter kümesine sahip daha basit bir düzenli ifade kullanabilirsiniz:

      Desen : \b[\w\.\-]+@[a-z0-9]+[a-z0-9\.\-]*[a-z0-9]+\.[a-z]{2,24}\b

      Ancak formülünüzü büyük/küçük harfe duyarsız hale getirin:

      =RegExpMatch(A5, $A$2, FALSE)

      Eşleşen regex ile Excel EĞER formülü

      Dahili ve özel işlevler iyi bir uyum içinde olduğundan, bunları tek bir formülde birlikte kullanmanızı engelleyecek hiçbir şey yoktur.

      Bir normal ifade eşleşirse bir şey döndürmek veya hesaplamak ve eşleşmezse başka bir şey döndürmek için, özel RegExpMatch işlevini IF mantıksal metnine yerleştirin:

      IF(RegExpMatch(...), [value_if_true], [value_if_false])

      Örneğin, A5'teki bir dize geçerli bir e-posta adresi içeriyorsa "Evet"; aksi takdirde "Hayır" sonucunu döndürebilirsiniz.

      =IF(RegExpMatch(A5, $A$2,), "Evet", "Hayır")

      Regex'in eşleşip eşleşmediğini say

      Yerel Excel işlevleri düzenli ifadeleri desteklemediğinden, doğrudan COUNTIS veya COUNTIFS işlevine bir regex koymak mümkün değildir. Neyse ki, özel işlevimizi kullanarak bu işlevi taklit edebilirsiniz.

      Telefon numaralarını eşleştirmek için bir regex kullandığınızı ve sonuçları B sütununda çıktıladığınızı varsayalım. Kaç hücrenin telefon numarası içerdiğini bulmak için B5:B9'daki DOĞRU değerleri saymanız yeterlidir. Bu da standart EĞERSAY formülü kullanılarak kolayca yapılabilir:

      =COUNTIF(B5:B9, TRUE)

      Çalışma sayfanızda fazladan sütun istemiyor musunuz? Sorun değil. Özel işlevimizin aynı anda birden fazla hücreyi işleyebileceğini ve Excel'in TOPLA özelliğinin bir dizideki değerleri toplayabileceğini göz önünde bulundurarak, işte yapmanız gerekenler:

      • RegExpMatch'e bir aralık referansı sağlayın, böylece TRUE ve FALSE değerlerinden oluşan bir dizi döndürür.
      • Mantıksal değerleri birlere ve sıfırlara zorlamak için çift olumsuzlama (--) kullanın.
      • Elde edilen dizideki 1'leri ve 0'ları toplamak için SUM işlevini alın.

      =SUM(--RegExpMatch(A5:A9, $A$2))

      Ultimate Suite ile Regex eşleştirme

      Ultimate Suite'imizin kullanıcıları, eklenti kurulumu sırasında Excel'e sorunsuz bir şekilde entegre edildikleri için çalışma kitaplarına herhangi bir VBA kodu eklemeden dört güçlü Regex işlevinden yararlanabilirler. Özel işlevlerimiz standart .NET RegEx motoru tarafından işlenir ve tam özellikli klasik normal ifadeleri destekler.

      Özel RegexMatch işlevi nasıl kullanılır?

      Ultimate Suite'in en son sürümünün yüklü olduğunu varsayarsak (2021.4 veya üstü), iki basit adımda bir Regex Match formülü oluşturabilirsiniz:

      1. Üzerinde Ablebits Verileri sekmesinde Metin grubunu seçin, tıklayın Regex Araçları .

    • Üzerinde Regex Araçları bölmesinde, aşağıdakileri yapın:
      • Kaynak dizeleri seçin.
      • Deseninizi girin.
      • Seçin Maç seçenek.
      • Sonuçları değer olarak değil formül olarak almak için Formül olarak ekle onay kutusu.
      • Tıklayınız Maç Düğme.

      Bir dakika sonra AblebitsRegexMatch işlevi, verilerinizin sağındaki yeni bir sütuna eklenir.

      Aşağıdaki ekran görüntüsünde, fonksiyon A sütunundaki dizelerin 7 basamaklı sayılar içerip içermediğini kontrol eder.

      İpuçları:

      • İşlev şu şekilde olabilir takılı doğrudan bir hücrede standart aracılığıyla Fonksiyon Ekleme altında kategorize edildiği iletişim kutusu AblebitsUDF'ler .
      • Varsayılan olarak, formüle düzenli bir ifade eklenir, ancak bunu ayrı bir hücrede de tutabilirsiniz. Bunun için, 2. bağımsız değişken için bir hücre başvurusu kullanmanız yeterlidir.
      • Varsayılan olarak, işlev büyük/küçük harfe duyarlı . Büyük/küçük harfe duyarlı olmayan eşleştirme için (?i) kalıbını kullanın.

      Daha fazla bilgi için lütfen AblebitsRegexMatch fonksiyonuna bakın.

      Excel'de düzenli ifade eşleştirme bu şekilde yapılır. Okuduğunuz için teşekkür ediyor ve gelecek hafta sizi blogumuzda görmeyi dört gözle bekliyorum!

      Mevcut indirmeler

      Excel Regex Eşleştirme örnekleri (.xlsm dosyası)

      Ultimate Suite 14 günlük tam işlevli sürüm (.exe dosyası)

    Michael Brown, yazılım araçlarını kullanarak karmaşık süreçleri basitleştirme tutkusuna sahip, kendini adamış bir teknoloji meraklısıdır. Teknoloji endüstrisinde on yılı aşkın deneyimiyle Microsoft Excel ve Outlook'un yanı sıra Google E-Tablolar ve Dokümanlar'daki becerilerini geliştirdi. Michael'ın blogu, bilgisini ve uzmanlığını başkalarıyla paylaşmaya, üretkenliği ve verimliliği artırmaya yönelik takip etmesi kolay ipuçları ve eğitimler sağlamaya adamıştır. İster deneyimli bir profesyonel, ister yeni başlayan olun, Michael'ın blogu, bu temel yazılım araçlarından en iyi şekilde yararlanmak için değerli bilgiler ve pratik tavsiyeler sunar.