Normal ifadeler (örneklerle) - 1

"Ve şimdi size düzenli ifadelerden bahsedeceğim. Bu konu aynı zamanda hem karmaşık hem de basit. Düzenli ifadeleri tam olarak anlamak için iki veya üç ağır kitap okumanız gerekebilir ama size bunları nasıl kullanacağınızı öğretebilirim. Şu anda."

"Deneyimli programcıların şaka yapmayı sevdiği gibi, bir sorununuz varsa ve bunu normal ifadelerle çözeceğinizi düşünüyorsanız, artık iki sorununuz var demektir."

"Hmm."

"Umarım seni çok korkutmamışımdır dostum. Değil mi?"

"Tamam, güzel. Yeni konumuz düzenli ifadeler."

"Onları basitleştirirsek, normal ifadeler dizeler için kalıplardır."

" Bir dizenin belirli bir kalıpla eşleşip eşleşmediğini kontrol edebilirsiniz . Ayırıcı veya kalıp kullanarak bir diziyi parçalara da bölebilirsiniz."

"Fakat basit bir şeyle başlayalım: örüntü nedir? "

"SQL'de (ancak Java'da değil), bir dizenin belirli bir kalıpla eşleşip eşleşmediğini kontrol edebilirsiniz. Şu şekilde görünür:"

name like 'Alex%'

Burada name bir değişkendir, like bir kalıbı kontrol etme komutudur ve "Alex%" kalıptır.

Bu durumda %, herhangi bir dize veya alt dize anlamına gelir.

Model Desenle eşleşen dizeler
"Alex%" Alex
Alex andr
Alex ander
Alex andra
….
'%X%' Mak x
Ma x im
Ale x andr
'%A' Olg a
Helen a
Ir a

"SQL'de, yalnızca bir başka karakter olması gerektiğini belirtmeniz gerekirse, o zaman alt çizgi karakterini kullanırsınız: "_"."

Model Desenle eşleşen dizeler
"Alex%_" Alex
Alex andr
Alex ander
Alex andra
….
'_X' Balta
Bx
Cx
'___' Aaa
Aab
Bbb

"Bu mantıklı."

"Tamam, o zaman normal ifadelere geçelim."

"Normal ifadeler tipik olarak yalnızca karakter sayısında değil, aynı zamanda 'içeriğinde' kısıtlama içerir. "Herhangi bir maske genellikle iki (bazen daha fazla) bölümden oluşur: ilki karakter 'tercihlerini' tanımlar ve ikincisi karakter sayısını açıklar ."

"İşte bazı içerik örnekleri:"

Model Tanım örnekler
. Herhangi bir karakter 1
\D herhangi bir rakam 7
\D Herhangi bir rakam olmayan C
\S Boşluk, satır sonu veya sekme karakteri ''
\S Boşluklar, sekmeler ve satır sonları dışında her şey F
[az] a'dan z'ye herhangi bir harf z
[0-9] 0'dan 9'a kadar herhangi bir rakam. 8
\w Herhangi bir kelime karakteri C
\W Herhangi bir kelime olmayan karakter _

"Bunları hemen hatırlamayacağım ama çok da zor görünmüyor."

"Mükemmel, o zaman işte bir maskedeki karakter sayısına ilişkin örnekler : "

Model Tanım örnekler
A? 'A' karakteri bir kez geçiyor ya da hiç geçmiyor A
B+ 'B' karakteri bir veya daha fazla kez geçiyor BBBB
C* 'C' karakteri sıfır veya daha fazla kez geçiyor CCC
D{n} 'D' karakteri n kez geçiyor D{4} kalıbı DDDD ile eşleşir
E{n,} 'E' karakteri n veya daha fazla kez geçiyor E{2,} kalıbı EEEEEEE ile eşleşir
F{n,m} 'F' karakteri n ve m kez arasında geçiyor E{2,4} kalıbı EEEE ile eşleşir

"Bu oldukça basit görünüyor."

"Her şeyi çok çabuk anlıyorsunuz. Şimdi hep birlikte nasıl göründüğüne bakalım:"

Model Tanım örnekler
[reklam]? 'a' ve 'd' arasındaki bir karakter bir kez geçer veya hiç geçmez bir, b, c, d
[bd,z]+ 'b', 'c', 'd' veya 'z' karakterleri bir veya daha fazla kez geçiyor b, bcdcdbdbdbdbzzzzbbzbzb, zbz
[1,7-9]* 1, 7, 8 veya 9 rakamları sıfır veya daha fazla kez oluşur 1, 7, 9, 9777, 111199
1{5} 1 rakamı 5 kez oluşur 11111
[1,2,a,b]{2} 1, 2, 'a' veya 'b' sembolleri iki kez geçiyor 11, 12, 1a, ab, 2b, bb, 22
[a,0]{2,3} 'a' veya 0 sembolleri 2 veya 3 kez geçer aa, a0,00,0a, aaa,000, a00,0a0, a0a

"Hâlâ her şey açık."

"Gerçekten mi? Hmm. Ya her şeyi çok iyi açıkladım ya da sen çok çabuk kavradın. Her iki şekilde de bu bizim için iyi."

"İşte size birkaç yeni fikir."

"Normal ifadeler genellikle alt dizeleri bulmak için kullanıldığından, kalıplarımıza iki karakter (^ ve $) daha ekleyebiliriz."

"^, alt dizenin, dizenin başlangıcını içermesi gerektiği anlamına gelir."

"$, alt dizenin dizenin sonunu içermesi gerektiği anlamına gelir."

"İşte bazı örnekler:"

Model Desenle eşleşen dize ve alt dizeler
bir {3} aaa  bir  aaa  bir  aaa
bir{3}$ aaa bir aaa bir  aaa
^a{3} aaa  bir aaa bir aaa
^a{3}$ aaa bir aaa bir aaa

"Ve bir önemli nokta daha."

"Normal ifadelerde aşağıdaki karakterlerin özel anlamı vardır: [ ] \ / ^ $ . | ? * + ( ) { }. Bunlara kontrol karakterleri denir. Dolayısıyla, bunları dizelerde kullanamazsınız."

"Java kodunda olduğu gibi çıkış yapılmalıdır. "Ve yine Java kodunda olduğu gibi bunun için '\' karakteri kullanılır."

"Üç 'den oluşan bir diziyi tanımlamak istersek '?' karakterler, '?{3}' yazamayız, çünkü '?' bir kontrol karakteridir. Bunu şu şekilde yapmalıyız: \?{3}. '\' karakteri kullanmak istiyorsak '\\' yazmamız gerekir."

"Tamam anladım."

"Ve şimdi başka bir ilginç bilgi. Java kodlu dosyalarda, bir kontrol karakteri olduğu için '\' karakteri de dizgilerde kaçmalıdır."

"Elbette."

"Yani, bir dizede bir Java normal ifadesi tanımlamaya çalışıyorsanız, '\' karakterinden iki kez kaçmanız gerekir."

"İşte bir örnek:"

'c:\anything' ile eşleşen bir maske istiyorum
Teorik olarak, normal ifade şöyle görünmelidir:
bir 'c' karakteri,
iki nokta üst üste,
ters eğik çizgi,
nokta ve yıldız (herhangi bir sayıda karakteri belirtmek için). Okunabilirliği artırmak için boşluklar ekledim:
c : \ .*
Ama '\' ve '.' karakterleri kaçılması gerekir, bu nedenle normal ifade şöyle görünecektir:
c :   \\ \. *
Veya boşluksuz
c: \\ \. *
"Normal ifademizde üç ters eğik çizgi olmalı.
Bu, bir Java dosyasında normal ifadenin şöyle görüneceği anlamına gelir:"
String regexp = "c: \\\\ \\. *";

"Vay! Vay. Şimdi biliyorum."

"Ve bu konuyu daha derine inmeye karar verirseniz, işte size birkaç iyi bağlantı:"

Wikipedia dersi