Gamepedia Yardım Viki
Advertisement

Düzenli ifadeler veya kısacası "regex", metin dosyalarında arama yapmak için kullanılabilecek karakter dizeleridir. Genellikle bir vikide, bunları viki sayfalarının kaynağında arama yapmak ve bir sayfada değişiklik yapmak için kullanırsınız. Bu genellikle AutoWikiBrowser veya AWB aracı kullanılarak yapılır. Bu sayfa özellikle AWB bağlamındaki düzenli ifadeler hakkında konuşacak, ancak Notepad++ ve SublimeText gibi farklı regex motorlarının bazı şeylere farklı davranabileceğini unutmayın. Ayrıca, modül yazıyorsanız, Lua'nın dize kalıpları normal ifadeden önemli ölçüde farklıdır. Bu sayfa tonlarca ayrıntıya girmeyecektir, bu nedenle hangi ana programı kullandığınızdan bağımsız olarak uygulanmalıdır, ancak bazı şeylerin başka yerlerde biraz farklı bir sözdizimi olabileceğini unutmayın.

Örnekler

Bu kılavuz nasıl kullanılır

Bu kılavuz, teknik yazıları okumaktan çok rahatsız olan kişiler için yazılmıştır. Teknik dokümanları okumayı önemsemiyorsanız, site regular-expressions.info bilmek isteyebileceğiniz her şeyin çok daha eksiksiz ve özlü bir açıklamasına sahiptir. Ancak en başından itibaren teknik olmanın bedeli gelir ve en azından biraz deneyime sahip olana kadar bunaltıcı olabilir. Ayrıca Vikipedi AWB kılavuzundaki düzenli ifadeler kaynağı "kopya kağıdı" referansı olarak yararlı bulabilirsiniz.

Bu sayfanın amacı, normal ifade ile ilgili bilmeniz gereken her şeyi size öğretmemek için sizi bir kaynak olarak regular-expressions.info kullanmaya hazırlamaktır.

Başlangıçta, yalnızca gösterim amacıyla oluşturulmuş bir sözdizimi kullanıyoruz. Standart normal ifade sözdizimini kullandığımızda, oluşturduğumuz her normal ifade şöyle görünür: Ben gerçek bir düzenli ifadeyim! Bu normal ifadelerin tümü AWB'ye (veya JavaScript'e) kopyalanabilir ve olmasını istediğiniz şekilde yürütülebilir.

AWB'ye özgü düzenli ifadeler

Başlamadan önce hızlı bir not....

AWB'deki "çok satırlı" ve "tek satırlı" ne anlama geliyor? Bunu henüz anlamayabilirsiniz, ancak bu AWB'deki regex hakkında bir SSS'dir ve bu yüzden başlangıç noktasına dahil etmek istedim. Şimdilik bu bölümü atlamaktan ve daha sonra tekrar gelmekten çekinmeyin.

AutoWikiBrowser kullanıyorsanız, normal ifadelerle ilişkili bazı seçenekler vardır, "çok satırlı" ve "tek satırlı". İlk başta "çok satırlı" gibi birden çok satır girdiğiniz anlamına gelebilir ve "tek satır" yalnızca bir satır girdiğiniz anlamına gelir, ancak aslında bu iki terimin çok belirgin anlamları vardır. "Test Et" i tıklar ve AWB Regex Test Cihazının içinde gezdirirseniz hangisinin hangisi olduğunu unutmanız durumunda bir ipucu açılır.

  • Çok satır - Varsayılan olarak, ^ ve $ karakterleri, tüm viki sayfasının başlangıcı ve bitişiyle eşleşir. Bunu kontrol ederseniz, her satırın başlangıcına ve sonuna uyacak şekilde anlam değiştirirler - veya başka bir deyişle, vikimetinize eşleşmek istediğiniz birden fazla satıra sahip olarak davranır.
  • Tek satır - Varsayılan olarak, . karakteri yeni satır karakteri hariç her şey ile eşleşir. Yeni satır karakteri \n tarafından verilir. Bu kutuyu işaretlerseniz, . anlamını yeni satırlarla eşleşecek şekilde değiştirir. Başka bir deyişle, vikisayfanıza .* veya başka bir nicelik belirteci eşleştirmek amacıyla tek bir satırmış gibi davranacaktır.

Bir yakalama grubu kavramını keşfetme

Aşağıdaki senaryoyu düşünün:

Beş yaşındasınız ve ailenizin bilgisayarında Mayın Tarlası oynuyorsunuz. Yaklaşık 10 dakika sonra sıkılırsınız ve açık pencerelere bakmaya karar verirsiniz. Bunlardan biri bir alışveriş listesi ile bir Notepad++ dosyası! Annenin her zaman alışveriş listeleri yazdığını biliyorsun ve sonra Baba alışverişi yapıyor ve her zaman listede olanı satın alıyor. Parlak bir fikir oluşmaya başlar. Alışveriş listesindeki her bir öğeyi "Şeker" demek için değiştirdiyseniz, ne kadar şeker yiyeceğinizi düşünün!

Şu anda alışveriş listesi şöyle:

GS - un
GS - buharlaştırılmış süt
GS - şeker
GS - kabak
GS - yenibahar
OSS - tonik
AS - süpriz

İmleci ilk satıra taşıyın ve "un"'u "şekere" değiştirin. Ama sadece beş yaşındasın - yazmak çok zor! "Allah'ım," diyorsunuz. "Tüm bu değişimleri yapmanın daha iyi bir yolu olmalı!" Bul-değiştir'i biliyorsunuz, ancak bunun OLASI OLABİLECEĞİNİ burada göremiyorsunuz. Umutsuzluk içinde, robot arkadaşınıza dönersiniz. "Robot arkadaş, yardım edebilir misin?" diyorsun. Ancak robot arkadaşınız plastik bir kurmalı oyuncak ve hiçbir şey söylemiyor.

"Ah, sorunu biliyorum!" sence. "Robot Arkadaşının özel talimatlara ihtiyacı var çünkü o bir robot!" Bir saniyeliğine düşünüyorsun. "Robot Arkadaş, şeker demek için her öğeyi değiştirin!" Robot Friend hala hiçbir şey yapmıyor. Yine nedenini merak ediyorsunuz. "Hmm," diyorsunuz. "Belki Robot Arkadaşının bir öğenin ne olduğunu bilmemesi nedeniyle!"

Bu oldukça iyi bir tahmin! (Plastik bir oyuncakla konuştuğunuz gerçeğiyle açıkça ilgisi yoktur.) Bakkal listesinde, her öğe bir mağaza türünün kısaltması ve daha sonra ondan ne satın alınacağıdır. GS Bakkal, OSS Ofis Malzemeleri Mağazası... AS nedir? Muhtemelen orada şekerleri ne olursa olsun.

"Robot Arkadaş," diyorsunuz. "Bu metin dosyasının her satırında, çizgi sonra tüm içeriği şeker kelimesi ile değiştirin." Vay canına, bu gerçekten özel! Ne yazık ki Robot Friend hala plastik bir oyuncak ve hiçbir şey yapmıyor.

"Tamam," diyorsun. "Bunu google'da yapacağım!" Yani google'a gidersiniz ve "Şeker demek için ailemin alışveriş listesindeki her şeyi nasıl değiştiririm???" İlk sonuç "Şeker almak için düzenli ifadeleri öğrenin"

"Bu umut verici görünüyor," diyorsunuz ve bağlantıyı açıp okumaya başlıyorsunuz. Yapmanız gereken ilk şey, bul-değiştir penceresini Notepad++ ile açmaktır. "Vay canına, o kadar kullanışlı ki ailem alışveriş listeleri için böyle güzel bir metin editörü kullanıyor." Değiştir iletişim kutusunu doğrudan açmak için Ctrl + H tuşlarına basın ve "Normal ifade" seçeneğini tıklayın.

Web sitesinde, yapmanız gereken ilk şey, ne bulacağınızı bulmaktır. “Ama bu belli, çizgiden sonraki şey!” kendinize düşünüyorsunuz. Ama sonra Robot Arkadaşı ve onun kesin talimat gereksinimini hatırlıyorsunuz. "Ahhh," diye düşünüyorsun. "Bul-değiştir sanal Robot Arkadaş gibi!" ŞİMDİ İKİ Robot Arkadaşınız olduğundan memnun olduğunuzda, değişikliği nerede daha kesin yapmak istediğinizi nasıl açıklayacağınızı düşünüyorsunuz.

"Yani, her satır bir konumla başlar. Bunu buluntudan yenisiyle değiştirmek için tutmak istiyorum. Sonra bir çizgi var ve ben de aynı tutmak istiyorum. Ve sanırım sonra Ama sonra ondan sonra her şey, hepsini silmem gerek!"

Tamam, bu bir insana iyi bir açıklama, ama bir Robot Arkadaşına değil. Tam olarak nasıl söylenir, "her şeyi kısa çizgiden sonraki boşluğa kadar ve aynı tutmak ve satırın geri kalanını şeker dizesine değiştirmek?"

Web sitesinin daha fazlasını okudunuz. "Yakalama Gruplarını Dizenizin Bölümlerini Aynı Tutmak İçin Kullanma" bir sonraki başlığı söylüyor. Arama/bulma dizenizin bir kısmını () içine alırsanız yakalanır! Ah, mükemmel!

Normal bulma-değiştirme işleminde, değiştirme parçasında yeniden yazarak aynı şeyi saklayabilirsiniz. Eğer "kedi"'yi "kedi" olarak değiştirmek istersen sadece "kedi"'yi iki kez yazarsın ve tüm değiştirmeleri yapar, ama hiçbir şey değişmezdi. Buradaki zorluk, aynı şeyi değiştirmekten değiştirmek zorunda kalmanız değil, aynı şeyi tuttuğunuzu bilmiyorsunuz.

Ah, bunun için bir çözüm var! Bir şekilde - sonraki boşluğa kadar olan her şeyi resmen temsil edebilirseniz, düzenli ifadeler, resmi tanımınızın eşleştiği karakterleri YAKALAMALANABİLİR ve ardından < code> $ 1 </ code>! Ve bundan sonra sadece "şeker" kelimesini yazdırmak istiyorsunuz... bu çok zor olmamalı!

Bakalım... arama dizesi şöyle görünecek:

([Satır+boşluk yoluyla her şeyi belirtmenin resmi yolu])[her şeyi belirtmenin resmi yolu]

(Yukarıda, () parantezleri, normal ifade sözdiziminin bir parçası olan anlamlı karakterlerdir. [] köşeli parantezleri, okumayı kolaylaştırmak ve hiçbir anlam ifade etmek için yanınızdadır.)

Ve sonra değiştirme dizesi tam olarak bu olacaktır:

$1şeker

Bu örnekle ilgili olmasa da, gerekirse DAHA FAZLA BİR YAKALAMA GRUBU yerleştirebileceğinizi ve sonra onlara $1, $2, vb. $1'den önce $2'ye erişerek yakalamalarınızın sırasını bile değiştirebilirsiniz! Vay canına, bu çok heyecan verici.

Ama bu sorunu nasıl bitirebilirim?? Web sitesindeki örneğe bakıyorsunuz. .* HER ŞEY ile eşleşeceğini söylüyor. Ah harika! Sence. (.*).* yazıp $1şeker ile değiştireceğim!

Ancak bunu denediğinizde aşağıdakileri elde edersiniz:

GS - unşeker
GS - buharlaştırılmış sütşeker
GS - şekerşeker
GS - kabakşeker
GS - baharatlışeker
OSS - tonerşeker
AS - süprizşeker

Evet, öyle değil! Hatanızı çabucak fark edersiniz. Robot Arkadaş her zaman TAMAMEN ne yapman gerektiğini söyler... ve sen asla durmayı söylemedin! Başka bir zaman deneyin:

Bul: (.*) - .*
Yerleştir: $1şeker

GSşeker
GSşeker
GSşeker
GSşeker
GSşeker
OSSşeker
ASşeker

Ah, hala pek değil ... İki yakalama grubuna sahip olduğumuz hakkında öğrendiklerimizi uygulayalım!

Bul: (.*)( - ).*
Bul: $1$2şeker

GS - şeker
GS - şeker
GS - şeker
GS - şeker
GS - şeker
OSS - şeker
AS - şeker

Ahhh, mükemmel! Yine de bir saniyeliğine düşünüyorsun. Gerçekten iki yakalama grubuna mı ihtiyacınız var? Bunun yerine bunu denediyseniz:

Bul: (.*) - .*
Değiştir: $1 - şeker

GS - şeker
GS - şeker
GS - şeker
GS - şeker
GS - şeker
OSS - şeker
AS - şeker

Oley, bu da işe yarıyor! Kendinizden memnun oldunuz ve şimdi bitkinlikten sonra yeni alışveriş listesini kaydediyor ve Robot Arkadaşı uyutuyorsunuz.

Ertesi gün, Annem diyor ki, "Çok üzgünüm, bugün balkabağı turtası yapacağız ama sonra babam bir sürü Cadılar Bayramı şekeri aldı! Bu yüzden, kandırmak için çok fazla şekerimiz olacak ya da tedavi ediciyiz, ama pasta yapamayız. "Ah hayır, ne yaptın? Robot Arkadaş güçlerini kötülük için kullandın ve şimdi pasta almıyorsun??? “Ama telafi edecek bir şey var,” diye devam ediyor anne. "Evlat edindiğimiz yeni yavru arkadaşınızla tanışın ve Baba Hayvan Barınağından aldı! Alışveriş listesinin söylediği için ona Candy diyoruz!"

Ahh, bu yüzden AS durdu! Pastayı tamamen unutuyorsun ve yeni kedi yavrusu ile oynuyorsun. Son.

Peki şimdiye kadar ne öğrendik?

  • Düzenli ifadeler, nispeten karmaşık bul-değiştir talimatlarını tam olarak ifade etmenin bir yoludur
  • .* herhangi bir şey ile eşleşir
  • Düzenli ifadenin bir kısmını parantez içine almak, değiştirme dizesi için "yakalar"
  • Yakalama gruplarına sırasıyla 1, 2, 3, 4, vb. numaralar atanır
  • Değiştirme dizesi, $1, $2, vb. ile yakalama gruplarına kaynak yapılabilir. Sıra yalnızca find dizesiyle belirlenir ve değiştirme dizesi herhangi bir sırayla yakalama gruplarına başvurabilir.

Karakter sınıfları, kaçış ve niceleyiciler

Her gün kaç yavru kedi gördüğünüzün günlüğünü tuttuğunuzu varsayalım:

Pazar - 5 yavru görüldü
Pazartesi - 3 yavru görüldü
Salı - 3 yavru görüldü
Çarşamba - 3 yavru görüldü

Bir gün tam cümlelerle yazmaya başlamak istediğinize siz karar verirsiniz. Yani şunu söylemeyi tercih edersiniz, "Pazar günü 5 yavru kedi gördüm." Böylece bir kelimeyi (haftanın günü) ve bir sayıyı (o gün gördüğünüz yavru sayısı) yakalamak ve bunları değiştirme dizenizin içine koymak istersiniz. İlk örneğimizde metnin tamamını seçmek için sadece .* kullandık. Ama yakaladığımız şey konusunda daha kesin olalım!

"Karakter sınıfı", programa belirli bir karakter grubunda ne tür karakterlerin bulunmasına izin verildiğini söylemenin kesin bir yoludur. Örneğin, "bir basamak" \d olarak yazılabilir. "Bir harf" \w olarak yazılabilir. "Bir karakter" . olarak yazılabilir. Evet, birçok karakterin normal ifade sözdiziminde özel bir anlamı var! Neyse ki, program, arama metnindeki gerçek bir dönemi eşleştirmeniz gerekebileceğini biliyor ve size bunu yapma olanağı veriyor. \. yazarsanız, ters eğik çizgi dönemi "kaçar".

Uluslararasılaştırma notu - \w tüm unicode karakterlerle eşleşmez, bunu ASCII olmayan harflerle kullanırken dikkatli olun!

"Tek haneli" ve "tek harf" dediğime dikkat edin, ancak ne yapmak istediğimizin ifadesinde "tek sayı" ve "tek kelime" yazıyor! Haftanın tüm günleri bir sürü mektup uzunluğunda. Ya bir günde 10 yavru kedi görürsem? O zaman sayı 2 basamak uzunluğunda!

Bunun da bir cevabı var. \d+ yazarsanız, bu "bir veya daha fazla hane" veya başka bir deyişle bir sayı ile eşleşir. \w+ yazarsanız, bu "bir veya daha fazla harf" anlamına gelir. Ve .+ yazarsak, bu "herhangi bir türden bir veya daha fazla karakter" anlamına gelir.

Sayı notu türleri - \d+ bazen sayıların ortasında virgül veya nokta olduğunu bilecek kadar akıllı değildir. Bu nedenle, herhangi bir yer değeri ayırıcısı olmadan yalnızca pozitif tamsayılarla eşleşir!

(\w+) - (\d+) yavru gördü şunu olur:
$1 gününde, $2 yavru gördüm.

Değiştir dizesinde noktadan kaçmamız gerekmediğine dikkat edin. Bunun nedeni, yedek dizimizin% 100 tam olarak tanımlanması gerektiğidir. Programa "Pazar" kelimesini herhangi bir karakter kümesiyle değiştir "hiç mantıklı gelmezken," yavru kediler "ve" şirin "kelimesi arasındaki herhangi bir karakter kümesini bul".

Veriler eksikse ne olur? Belki Perşembe günü gördüğüm yavru sayısını yazmayı unuttum, bu yüzden ipim sadece Perşembe - yavru kedi gördü olur. Bunu cümleye dönüştürmek istiyorum Perşembe günü, yavru kedi gördüm. Ben her şeyi değiştirdim aynı eylemde. Ancak, \d+ 1 veya daha fazla hane ile eşleşir ve... burada 0 hane vardır. Görünüşe göre bunu yapmanın bir yolu var!

(\w+) - (\d* *)yavru görüldü becomes:
$1 gününde, $2kedi gördüm.

Uyarı! Ayrıca \d* ile birlikte boşluk da ekledik, çünkü basamak orada değilse aşağıdaki boşluk da orada olmayacak!

Burada yaptığımız şey + bir * olarak değiştirmek. * karakteri, + karakterine benzer, ancak 0 veya daha fazla karakterle eşleşebilir. Böylece bu bul-değiştir, hem "Perşembe - yavru görüldü hem de Çarşamba - 10 yavru görüldü aynı anda doğru şekilde dönüştürecektir.

* ve + karakterlerine "niceleyiciler" adı verilir, çünkü bunlar eşleştirdiğiniz karakter sayısını "nicelleştirmenin" yoludur. Nicelleştiriciler hakkında bahsedilecek bir şey daha var.

Başlangıç metnimizin bunun gibi göründüğünü varsayalım:

Pazar - 2 yavru kedi ve bir demet tavşan ve 3 yavru gördüm
Pazartesi - birkaç llamas ve birkaç yavru kedi ve 2 fil gördüm
Salı - 5 ayı ve bir tek boynuzlu at gördüm

Bunu şu şekilde yeniden biçimlendirmek istiyoruz:

Pazar günü 2 yavru kedi gördüm. Ayrıca bir demet tavşan ve 3 yavru gördüm.
Pazartesi günü birkaç lama gördüm. Ayrıca birkaç yavru kedi ve 2 filler gördüm.
Salı günü 5 ayı gördüm. Ayrıca bir tek boynuzlu at gördüm.

Daha önce, gördüğümüz hayvanların sayısı her zaman bir rakam koleksiyonu veya \d+ idi. Ancak şimdi bazı İngilizce ifadeler de karışık! Bu yüzden sadece \d kullanamayız. Neyse ki . karakter sınıfını da keşfettik. Öyleyse kullanalım:
(\w+) - (.+) ve (.*) görüldü (https://regex101.com/r/Fe033j/1/) şu olur
$1 gününde, $2 gördüm. Ayrıca $3 gördüm.

Fakat bekle! Bir sorun var! Bu aslında elde ettiğimiz sonuç:

Pazar günü, 2 yavru kedi ve bir demet tavşan gördüm. Ayrıca 3 yavru gördüm.
Pazartesi günü birkaç lama ve birkaç yavru kedi gördüm. Ayrıca 2 filler gördüm.
Salı günü 5 ayı gördüm. Ayrıca bir tek boynuzlu at gördüm.

Sorunu görüyor musunuz? - ilk ve gitmek için $1 yerine ikinciye kadar gittik! Oh hayır, bizim istediğimiz bu değil. + ve * nicelik belirteçleri "açgözlüdür" - "bul" dizenizin bir sonraki bölümüne geçmenize izin vermeden önce kendileri için olabildiğince fazla karakter alırlar. Tam tersinin mümkün olduğunca az almasını istiyoruz.

"Açgözlü"'nün tersi "cömert" olabilir ama hepimiz kötü niyetle ilgiliyiz. Bu yüzden mümkün olduğunca az karakter alan sürümü "tembel" olarak adlandıracağız. Bu yüzden mümkün olduğunca az alan "açgözlü" miktar belirleyiciler ve mümkün olduğunca az zaman alan "tembel" miktar belirleyiciler vardır. Tembel niceleyiciler için gösterim aşağıdaki gibidir:

  • +? mümkün olduğunca az 1 veya daha fazla karakterle eşleşir
  • *? mümkün olduğunca az 0 veya daha fazla karakterle eşleşir

Bunun yerine aşağıdakileri eşleştirelim:
(\w+) - (.+?) gördü ve (.*) şunu olur
$1 gününde, $2 gördüm. Ayrıca $3 gördüm.

Ve şimdi istediğimiz sonucu elde ediyoruz!

İncelemek için:

  • "Karakter sınıfları", "rakamlar" veya "harfler" gibi karakter türlerinden oluşan gruplardır. Burada ele almadığımız bir sürü karakter sınıfı var.
  • "Niceleyiciler" bir kerede birden fazla karakteri eşleştirmenizi sağlar. 4 niceleyici hakkında bilgi edindik: +, *, +? ve *?.
  • . gibi bazı özel karakterlerin, bir dize içinde aramak istiyorsanız \ ile kaçması gerekir, aksi takdirde özel anlamları vardır.

Yine, bu konulardaki normal ifadenin her yönünü kapsamlı bir şekilde ele almaya yaklaşmayacağımızı unutmayın. Daha fazla bilgi için bölümün başındaki bağlantılı kaynaklara göz atın!

"Alternatif", "Veya" olarak da bilinir

Diyelim ki özellikle heyecanlı bir hafta geçirdiniz, bazı günlerde yavru kedi, bazı günlerde tavşan ve bazı günlerde yavru gördünüz! Sevimli bebek hayvanlarda iyi bir tada sahip olduğunuz için, yavru kedi ve tavşanların yavrulardan çok daha şirin olduğunu düşünüyorsunuz. Verileriniz şöyle görünür:

Pazar - 5 yavru gördüm
Pazartesi - 3 tavşan gördüm
Salı - 7 tavşan gördüm
Çarşamba - 2 yavru gördüm

Yavru kedi vs tavşan hakkında bilgi atmak ve bu kelimelerin her ikisini de "sevimli hayvanlar" ile değiştirmek istiyorsunuz. Normal ifade olmadan bunu 2 ayrı arama ile yapabilirsiniz: ilk yavru kedi -> sevimli hayvanlar ve sonra tavşanlar -> sevimli hayvanlar. Ama düzenli ifade ile, sadece bir tane yapabiliriz!

kediler|tavşanlar şunu olur:
sevimli hayvanlar


| karakterine "veya" demenin gerçekten süslü bir yolu olan "alternatör" denir. Soldaki metni VEYA sağdaki metni eşleştirmenizi sağlar.

Hedefimizi biraz değiştirelim. Sadece "yavru kedileri" ve "tavşanları" "sevimli hayvanlarla" değiştirmek yerine biraz daha heyecan katmak istiyoruz! Bunu Pazar - 5 yavru kedi gördü Pazar - yaşasın, 5 sevimli hayvan! olacak şekilde tekrar deneyelim. Ama yavrular sevimli olmadığı için, onu yalnız bırakacağız. Az önce öğrendiğimiz "değişimi" kolayca kullanabiliriz:

- (\d) yavru görüldü|- (\d) tavşan görüldü şunu olur......

Bekle, istediğimizi elde etmek için bunu nasıl yapıyoruz? Yakalama gruplarının soldan sağa numaralandığını hatırlıyor musunuz? Yani hayvan sayımız $1 ya da $2 olabilir ve hangisini bilmiyoruz. Ama aslında, bunlardan biri boş olacak, böylece onları yan yana koyabiliriz:

- oley, $1$2 tatlı hayvan!.

Eğer işe yaradığına dair kanıt görmek ve daha fazla oynamak istiyorsanız bu örneği kendiniz deneyebilirsiniz.

Eğer $1 $2 ve bunlardan biri boş olan şey biraz kafa karıştırıcı ve kıvrık gibiydi, iyi, çünkü. Çünkü gerçekten yapmak istediğimiz şey, ilk satırı yalnız bırakarak, sadece satırın son kelimesine veya "uygulamak"'tır. Bunu nasıl yapabiliriz?

Yakalamayan gruplar

Vay canına, son bölümde ne kadar uçurum vardı. Önce örneği oradan bitirelim. Bir alternatör koyarsanız (bunun "veya" demenin süslü bir yolu olduğunu ve şu şekilde yazıldığını unutmayın: |), bir yakalama grubunun içine " veya "maçın sadece bir kısmına! Hadi deneyelim:

- (\d) (yavru|tavşan) görüldü şunu olurdu
- hooray, saw $1 cute animals!

GÜZEL! Parantezler iki şey yapabilir, birlikte bir işlem yapabilir ve AYRICA çıktıda kullanılacak içeriği "yakalayabilir"! Ancak, her zaman bu şeylerin her ikisini de yapmak ister miyiz? Aslında, ikinci yakalama grubunun içeriğini kullanmıyoruz, yedek metinde $2 bulunmuyor. Öyleyse, "Bu yakalama grubunun gruplama bölümünü istiyorum ama aslında onu yakalamak istemiyorum" diyecek bir sözdizimi yaratalım. Başka bir deyişle, yakalamayan bir grup istiyoruz ya da... yakalamayan bir grup istiyoruz!

- (\d) (?:yavru|tavşan) görüldü şunu olurdu
- oley, $1 sevimli hayvan bulundu!

Grubun başındaki ?: gördünüz mü? Bu, "Bir gruba ihtiyacım var ama onu yakalamasını istemiyorum" anlamına geliyor. Bu, özellikle çok fazla değişiklik yapmak istediğinizde ve ayrıca bir düzenli ifadeyi düzenliyorsanız ve bir grup eklemeniz gerekiyorsa, ancak değiştirme teriminizi yalnızca daha fazla gruplama ekleyerek.

?: sözdizimini kullanmanız gerçekten kafa karıştırıcıysa, sorun değil - yakalamayan gruplar aslında onlar olmadan sahip olmadığınız düzeli ifade yeni işlevler eklemezler, sadece yaparlar yakalama gruplarınızla daha kolay çalışabilirsiniz.

Zero-width assertions

Not - bu, regular-expressions.info'daki "sıfır uzunluklu eşleşmeler" ile aynı konu DEĞİLDİR!

"Alternatör" gibi, bu basit bir anlamı olan korkutucu görünen bir ifadedir. Ancak terimi tanımlamadan önce, düzenli ifadeler hakkında birkaç şey gözlemleyelim. keeeedi dizesiyle eşleşmek isterseniz ked+i yazabilirsiniz. Veya kee*di (bu eşdeğerdir) yazabilirsiniz (sizin için açık değilse bu normal ifadenin neden aynı olduğunu anlamak için bir dakikanızı ayırın). k ve k ile eşleşir, ardından e+ veya ee* tüm a'larla ve ardından di, di ile eşleşir. Burada dikkat edilmesi gereken önemli şey, metnin her bölümünün normal ifadedeki tek bir şeyle eşleştirilmesidir. Yani, k ile eşleştikten sonra, hepsi bu. k yapılır. Normal kodda daha fazla k eşleşmesine izin verilmiyor.

(Bu arada bir kaza değil. Dev bir tavşan deliğinden aşağı inmek istiyorsanız, check out Vikipedi'de regular languages veya deterministic finite automata bakın. Tavşan deliği olması konusunda ciddiyim. Ancak çok havalı.)

Yaniiii bazı şeyleri bir kereden fazla eşleştirmek isteseydik? Örneğin, "kedi" kelimesini bulmak istediğimizi, "felaket" veya "kediler" kelimesini DEĞİLDİR. Sorun değil, sadece kedi'yi kontrol edin değil mi? Yanlış! Dize kedi. veya "kedi" veya hatta kedi! derse? Hmmmmmm tamam belki bu pek iyi değil. Yani yapmak istediğimiz şudur: kedi'yi arayın ve sonra harf olmayan bir karakter arayın. (Karakter sınıfları hakkında ek bilgileri okursanız, bunu nasıl yapacağınızı bilirsiniz - eğer kontrol etmezseniz!) Peki ya kedi belgede en son şey ise?

İşte burada "sıfır genişlikli iddialar" devreye giriyor. Bu cümle, "herhangi bir miktarda aramamızı ilerletmeden, maçımız hakkında doğru olması gereken bir şey" anlamına geliyor. Ya da belirtmek için başka bir yol, "dizgide gerçekte karakter içermeyen bir dizenin bazı özelliklerini kontrol etmenin bir yoludur."

En basit sıfır genişlikli iddialar, "satır veya dosyanın başlangıcı" anlamına gelen ^ ve "satır veya dosya sonu" anlamına gelen $ şeklindedir. Çizgi ve dosya arasındaki seçim seçtiğiniz ayarlara bağlıdır, bkz. AWB'ye özgü düzenli ifadeler. cat örneğinde kullanacağımız şey kedi\b. \b "sınır" anlamına gelir ve bir sözcüğün o konumda başlamasını veya bitmesini gerektirir.

Etrafa bak

Bu konuyu tam olarak ele almak için regular-expressions.info sayfasına bakın.

Özel bir sıfır genişlikli iddianın türüne "etrafa bak" denir. Bu bölüm buraya dahil edilmiştir, çünkü insanlar bunu çok sormaktadır, ancak gerçek şu ki bu gereksiz derecede karmaşıktır ve neredeyse her normal ifade uygulamasının aynı şeyi başarmanın daha kolay bir yolu vardır. Lookaround, normal koşulunuza bazı koşulların doğru veya yanlış olup olmadığını kontrol eden sıfır genişlikli bir iddia eklemenize olanak tanır ve belirtiminiz ihlal edilirse normal ifadenin eşleşme yeteneğini iptal eder. Ses kafa karıştırıcı mı? Bu karmaşık bir sözdizimi ve AWB'nin gelişmiş aramasında "Eğer..." sekmesi kullanılarak değiştirilebilen karmaşık bir kavram ve son derece basit ve mantıklı........ evet. Ancak, kullanımı daha da zor olan kıvrımlı bir sözdizimi öğrenmek karşılığında "Eğer" sekmesini kullanmak için bir düğmeyi tıklatmama fikrinden hoşlanıyorsanız, okumaya devam edin!

Yavru kedi şirin ile eşleştirmek istediğinizi varsayalım ve yerine Evet, yavru kedi şirin ile değiştirin. Ama, hayır!!! birisi gerçekten güzel ve kötü bir cümlenizi bazen Yavruların sevimli (değil!!!) dediklerini söylemek için tahrip etti. Kim böyle bir şey yapar. KESİN OLARAK yazmak istemiyoruz Evet, yavru kedi sevimli (değil!!!), bu korkunç olurdu! Yapmak istediğimiz şey Kedi yavrularının sevimli olduğu yerleri bulmak. SONRA BURADA DEĞİLDİR (değil!!!). Şimdi, güzel yerlerde cümlenin ardından ne olduğunu bilmiyoruz - bu bir dönem olabilir, bir olabilir!, Satır sonu veya tamamen başka bir şey olabilir. Bu yüzden orada ne olduğu, ne olmadığı hakkında hiçbir garanti veremeyiz. Sıfır genişlikli bir iddianın görevi gibi geliyor!

Kullanmak üzere olduğumuz adı NEGATİF GÖRÜNÜM denir. Olumsuz çünkü burada olmamasını istiyorum ve Lookahead çünkü arıyoruz.... ileri. Diğer türler POZİTİF GÖRÜNÜŞ, OLUMSUZ GÖRÜNÜŞ ve OLUMLU GÖRÜNÜŞTÜR. Bu 4 modelin hepsi hem konsept hem de kullanım açısından benzerdir ve bu nedenle "bakış açısı" şemsiye terimi içine sokulurlar.

Önce sözdizimine bakalım. Daha önce de belirtildiği gibi, tam bilgi için regular-expressions.info dosyasını kullanmalısınız, burada sadece negatif ileriye bakacağız.

Yavru kediler sevimli(?! \(değil!!!\))

Mükemmel anladığımız ilk bölüm, Yavru kedi şirin eşleşir, iyi, Yavru kedi şirin. Peki ya ikinci kısım? Her şeyden önce, \( ve \) sadece değişmez ( ve ) karakterleri olduğunu görelim. kaçmak gerekiyor. Ve değil!!! sadece gerçek karakter değil!!!. Bu bizi sarıcıya bırakıyor, (?!BİR ŞEY BURAYA GELİYOR). Daha önce öğrendiğimiz gibi, parantezler "birlikte bir grup şey" veya "bir yakalama grubu" anlamına gelebilir. Bu durumda, "birlikte bir grup şey" anlamına gelir. ?! karakterleri, "önden bakın ve bunun içeriğinin dizede bir sonraki şey olmadığından emin olun!!!!" anlamına gelir. Yani bu normal ifade istediğimizi yapacak.

Negatif gözün içindeki şeylerin kendisi düzenli bir ifade olabilir. Örneğin, hain kedi karşıtı vandalımız, çabalarımızı farklı yerlerde farklı sayıda ünlem işareti kullanarak engellemeye çalıştıysa, bunun yerine bunu kullanabiliriz:

Yavru kediler sevimli(?! \(değil!+\))

Bu durumda, değil'den sonra 1 veya daha fazla ! s ile eşleşiriz.

Bu size çok kolay geliyorsa, devam edin ve kullanın! Ama değilse, gerçekten endişelenme. Ayrıca, seçimimizin çok fazla işten tasarruf etmiş olan Yavruların sevimli (değil!!!) kelime öbeğini içerdiğinden emin olmak için AWB'deki "Eğer" panelini kullanabilirdik.

Git düzenli-expressions.info okuyun!

Uyarı sadece bir kelime - bu site çılgın tam ve özellikle onlar aslında sizin için geçerli olmayacak bir sürü şey içerir. Örneğin, dengeleme gruplarını, özyineleme ve altyordamları dikkate almayın. Ayrıca, normal ifadenizi nereye yazdığınıza bağlı olarak, sözdizimi biraz farklı olabilir. Vikide normal ifade araması yapıyorsanız, \ b gibi bazı şeyler çalışmaz. Python, yakalama gruplarına başvurmak için farklı bir sözdizimi kullanır. Lua'nın dize deseni eşleşmesi hiç düzenli ifadeler değildir (kapsamı çok sınırlıdır) ve yaptıkları için Lua belgelerini okumalısınız. Bununla birlikte, bu sayfadaki çoğu şeyi anladıysanız, kendi başınıza öğrenmek için harika bir konumdasınız! Bir şey öğrenmeye değmeyecek kadar karmaşık görünüyorsa sağduyunuzu kullanmaktan çekinmeyin ve istediğiniz gibi şeyler atlayın. Unutmayın, bunlar hayatınızı kolaylaştırmak için bir araçtır - bu yüzden hayatınızı zorlaştırıyorsa, belki başka bir yaklaşım denemelisiniz. Ancak normal ifade hala süper güçlü, bu yüzden git eğlenin!

Advertisement