Normal İfadeler hakkında
Kısa açıklama
PowerShell'deki normal ifadeleri açıklar.
Uzun açıklama
Not
Bu makalede, PowerShell'de normal ifadeleri kullanmaya ilişkin söz dizimi ve yöntemler gösterilmektedir. Olası tüm ifadeleri kapsamaz. Daha kapsamlı bir referans için Normal İfade Dili - Hızlı Başvuru'ya bakın.
Düzenli ifade, metni eşleştirmek için kullanılan bir kalıptır. Gerçek karakterlerden, operatörlerden ve diğer yapılardan oluşabilir.
Bu makalede PowerShell'deki normal ifade söz dizimi gösterilmektedir. PowerShell'de normal ifadeler kullanan çeşitli operatörler ve cmdlet'ler bulunur. Aşağıdaki bağlantılardan sözdizimleri ve kullanımları hakkında daha fazla bilgi edinebilirsiniz.
- Select-String
- -eşleştirme ve -değiştirme operatörleri
- -bölme operatörü
- -regex seçeneğiyle switch ifadesi
PowerShell normal ifadeleri varsayılan olarak büyük/küçük harfe duyarlı değildir. Yukarıda gösterilen her yöntemin büyük/küçük harf duyarlılığını zorlamanın farklı bir yolu vardır.
Select-Stringiçin CaseSensitive parametresini kullanın.- Normal ifadeler kullanan operatörler için büyük/küçük harfe duyarlı sürümü kullanın:
-cmatch,-creplaceveya-csplit switchifadesi için-büyük/küçük harfe duyarlıseçeneğini kullanın
Karakter değişmezleri
Düzenli ifade, değişmez bir karakter veya bir dize olabilir. İfade, motorun belirtilen metinle tam olarak eşleşmesine neden olur.
# This statement returns true because book contains the string "oo"
'book' -match 'oo'
Karakter sınıfları
Tam modeli biliyorsanız karakter değişmezleri işe yarasa da karakter sınıfları daha az spesifik olmanızı sağlar.
Karakter grupları
[character group] herhangi bir sayıda karakteri bir defada eşleştirmenize olanak sağlarken, [^character group] yalnızca grupta OLMAYAN karakterlerle eşleşir.
# This expression returns true if the pattern matches big, bog, or bug.
'big' -match 'b[iou]g'
Eşleşecek karakter listeniz kısa çizgi karakterini (-) içeriyorsa, onu bir karakter aralığı ifadesinden ayırmak için listenin başında veya sonunda olmalıdır.
Karakter aralıkları
Bir desen aynı zamanda bir dizi karakter de olabilir. Karakterler alfabetik [A-Z], sayısal [0-9] veya hatta ASCII tabanlı [ -~] olabilir (tümü yazdırılabilir karakterler) ).
# This expression returns true if the pattern matches any 2 digit number.
42 -match '[0-9][0-9]'
Sayılar
\d karakter sınıfı herhangi bir ondalık rakamla eşleşecektir. Bunun tersine, \D ondalık olmayan herhangi bir rakamla eşleşecektir.
# This expression returns true if it matches a server name.
# (Server-01 - Server-99).
'Server-01' -match 'Server-\d\d'
Kelime karakterleri
\w karakter sınıfı herhangi bir [a-zA-Z_0-9] kelime karakteriyle eşleşir. Kelime olmayan herhangi bir karakteri eşleştirmek için \W kullanın.
# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'
Joker karakterler
Nokta (.), normal ifadelerde bir joker karakterdir. Yeni satır (\n) dışında herhangi bir karakterle eşleşir.
# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'
Boşluk
Herhangi bir boşluk karakterini \s karakter sınıfıyla eşleştirebilirsiniz. Boşluk olmayan herhangi bir karakteri \S ile eşleştirebilirsiniz. Gerçek boşluk karakterlerini ile eşleştirebilirsiniz.
# This expression returns true.
# The pattern uses the whitespace character class to match the leading
# space and a literal space to matching the trailing space.
' - ' -match '\s- '
Niceleyiciler
Niceleyiciler, giriş dizesinde her öğenin kaç örneğinin bulunması gerektiğini kontrol eder.
Aşağıda PowerShell'de bulunan niceleyicilerden birkaçı verilmiştir:
*Sıfır veya daha fazla kez.
+Bir veya daha fazla kez.
?Sıfır veya bir kez.
{n,m}En az
n, ancakmdefadan fazla olamaz.
Yıldız işareti (*), önceki öğeyle sıfır veya daha fazla eşleşir. Sonuç olarak, öğesi olmayan bir giriş dizesi bile bir eşleşme olacaktır.
# This returns true for all account name strings even if the name is absent.
'ACCOUNT NAME: Administrator' -match 'ACCOUNT NAME:\s*\w*'
Artı işareti (+), önceki öğeyle bir veya daha fazla kez eşleşir.
# This returns true if it matches any server name.
'DC-01' -match '[A-Z]+-\d\d'
? soru işareti önceki öğeyle sıfır veya bir kez eşleşir. Yıldız işareti * gibi, öğenin bulunmadığı dizelerle bile eşleşir.
# This returns true for any server name, even server names without dashes.
'SERVER01' -match '[A-Z]+-?\d\d'
{n, m nicelik belirteci, nicelik belirteci üzerinde ayrıntılı kontrole izin vermek için birkaç farklı şekilde kullanılabilir. İkinci öğe m ve virgül , isteğe bağlıdır.
{n}-
TAM OLARAK
nsayıda eşleştirin. {n,}EN AZ
nsayıda eşleştirin.{n,m}nilemsayısı arasındaki eşleşme.
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'
Çapalar
Çapalar, giriş dizesindeki eşleşmelerin konumuna bağlı olarak bir eşleşmenin başarılı veya başarısız olmasını sağlamanıza olanak tanır.
Yaygın olarak kullanılan iki çapa ^ ve $'dır. ^ düzeltme işareti bir dizenin başlangıcıyla, $ ise dizenin sonuyla eşleşir. Bağlantılar, istenmeyen karakterleri atarken metninizi belirli bir konumda eşleştirmenize olanak tanır.
# The pattern expects the string 'fish' to be the only thing on the line.
# This returns FALSE.
'fishing' -match '^fish$'
Not
Bir çapa ($) içeren bir normal ifadeyi tanımlarken, normal ifadeyi tek tırnak içine almanız gerekir ('). Çift tırnak (") kullanırsanız PowerShell dizeyi genişletilebilir bir değişken ifadesi olarak yorumlar.
PowerShell'de bağlayıcıları kullanırken Tek Satırlı ve Çok Satırlı normal ifade seçenekleri arasındaki farkı anlamalısınız.
- Çok satırlı: Çok satırlı mod,
^ve$öğelerinin giriş dizesinin başı ve sonu yerine her SATIRIN başlangıç sonuyla eşleşmesini zorlar. - Tek Satır: Tek satır modu, giriş dizesini Tek Satır olarak ele alır.
.karakterini,\nyeni satırı HARİÇ her karakterle eşleştirmek yerine, her karakterle (yeni satırlar dahil) eşleşmeye zorlar.
Bu seçenekler ve bunların nasıl kullanılacağı hakkında daha fazla bilgi edinmek için Normal İfade Dili - Hızlı Başvuru sayfasını ziyaret edin.
Kaçan karakterler
Ters eğik çizgi (\), normal ifade motoru tarafından ayrıştırılmamaları için karakterlerden çıkış yapmak için kullanılır.
Şu karakterler ayrılmıştır: []().\^$|?*+{.
Giriş dizelerinizde eşleştirmek için kalıplarınızda bu karakterlerden kaçmanız gerekir.
# This returns true and matches numbers with at least 2 digits of precision.
# The decimal point is escaped using the backslash.
'3.141' -match '3\.\d{2,}'
Regex sınıfının sizin için metinden kaçabilen statik bir yöntemi vardır.
[regex]::escape('3.\d{2,}')
3\.\\d\{2,}
Not
Bu, karakter sınıflarında kullanılan mevcut ters eğik çizgiler de dahil olmak üzere, tüm ayrılmış normal ifade karakterlerinden kaçar. Bunu yalnızca deseninizin kaçmanız gereken kısmında kullandığınızdan emin olun.
Diğer karakter kaçar
Özel karakter türlerini eşleştirmek için kullanabileceğiniz ayrılmış karakter çıkışları da vardır.
Aşağıda yaygın olarak kullanılan birkaç karakter kaçışı verilmiştir:
\tBir sekmeyle eşleşir
\nYeni satırla eşleşir
\rBir satır başıyla eşleşir
Gruplar, Yakalamalar ve Değişiklikler
Gruplandırma yapıları, bir giriş dizesini yakalanabilecek veya göz ardı edilebilecek alt dizelere ayırır. Gruplandırılmış alt dizelere alt ifadeler denir. Varsayılan olarak alt ifadeler numaralandırılmış gruplar halinde yakalanır, ancak bunlara ad da atayabilirsiniz.
Gruplandırma yapısı parantezlerle çevrelenmiş normal bir ifadedir. Ekteki normal ifadeyle eşleşen herhangi bir metin yakalanır. Aşağıdaki örnek, giriş metnini iki yakalama grubuna böler.
'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True
Yakalanan metni almak için $Matches Hashtable otomatik değişkenini kullanın. Eşleşmenin tamamını temsil eden metin 0 anahtarında saklanır. $Matches karma tablosunun herhangi bir eşleşen modelin yalnızca ilk örneğini içerdiğini unutmamak önemlidir.
$Matches.0
The last logged on user was CONTOSO\jsmith
Yakalamalar, soldan sağa doğru artan sayısal Tamsayı tuşlarında depolanır. Capture 1, kullanıcı adına kadar tüm metni içerir; Capture 2 yalnızca kullanıcı adını içerir.
$Matches
Name Value
---- -----
2 CONTOSO\jsmith
1 The last logged on user was
0 The last logged on user was CONTOSO\jsmith
Bu önemli
0 anahtarı bir Tamsayı'dır. Saklanan değere erişmek için herhangi bir Hashtable yöntemini kullanabilirsiniz.
PS> 'Good Dog' -match 'Dog'
True
PS> $Matches[0]
Dog
PS> $Matches.Item(0)
Dog
PS> $Matches.0
Dog
Adlandırılmış Yakalamalar
Yakalamalar varsayılan olarak soldan sağa doğru artan sayısal sırada saklanır. Ayrıca yakalama grubuna bir ad atayabilirsiniz. Bu ad, $Matches Hashtable otomatik değişkeninde bir anahtar haline gelir.
Yakalama grubunun içinde, yakalanan verileri adlandırılmış bir anahtar altında depolamak için ?
PS> $string = 'The last logged on user was CONTOSO\jsmith'
PS> $string -match 'was (?<domain>.+)\\(?<user>.+)'
True
PS> $Matches
Name Value
---- -----
domain CONTOSO
user jsmith
0 was CONTOSO\jsmith
PS> $Matches.domain
CONTOSO
PS> $Matches.user
jsmith
Aşağıdaki örnek, en yeni günlük girişini Windows Güvenlik Günlüğü'nde saklar. Sağlanan normal ifade, kullanıcı adını ve alan adını mesajdan çıkarır ve bunları şu anahtarların altında saklar: ad içinN ve alan adı için D.
$log = (Get-WinEvent -LogName Security -MaxEvents 1).message
$r = '(?s).*Account Name:\s*(?<N>.*).*Account Domain:\s*(?<D>[A-Z,0-9]*)'
$log -match $r
True
$Matches
Name Value
---- -----
D CONTOSO
N jsmith
0 A process has exited....
Daha fazla bilgi için bkz. Normal İfadelerde Yapıları Gruplandırma.
Normal İfadelerde Yer Değiştirmeler
-replace operatörüyle normal ifadeleri (regex) kullanmak, yakalanan metni kullanarak metni dinamik olarak değiştirmenize olanak tanır.
<input> -replace <original>, <substitute><input>: Aranacak dize<original>: Giriş dizesinde arama yapmak için kullanılan normal ifade<substitute>: Giriş dizesinde bulunan eşleşmeleri değiştirmek için kullanılan normal ifade değiştirme ifadesi.
<original> ve <substitute> işlenenleri, karakter kaçışı veya ikame ifadeleri gibi normal ifade motorunun kurallarına tabidir. Değiştirme modeli, gerçek karakterlerle birlikte bir veya daha fazla değişiklikten oluşabilir.
Yakalama gruplarına, grup tanımlayıcısından önce $ karakteri kullanılarak <substitute> dizesinde başvurulabilir.
Yakalama gruplarına referans vermenin iki yolu Numaraya ve Ad'a göredir.
Numaraya Göre - Yakalama Grupları soldan sağa doğru numaralandırılır.
'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'John.D.Smith@contoso.comİsme Göre - Yakalama Gruplarına adla da başvurulabilir.
'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'FABRIKAM\Administrator
$& ifadesi eşleşen tüm metni temsil eder.
'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble
Uyarı
$ karakteri dize genişletmede kullanıldığından, değişmez dizeleri ikameyle kullanmanız veya çift tırnak kullanırken $ karakterinden kaçmanız gerekir.
'Hello World' -replace '(\w+) \w+', '$1 Universe'
"Hello World" -replace "(\w+) \w+", "`$1 Universe"
Hello Universe
Hello Universe
Ayrıca, değişmez karakter olarak $ karakterine sahip olmak istiyorsanız normal kaçış karakterleri yerine $$ kullanın. Çift tırnak kullanırken, hatalı değişiklik yapılmasını önlemek için yine de tüm $ örneklerinden kaçının.
'5.72' -replace '(.+)', '$$$1'
"5.72" -replace "(.+)", "`$`$`$1"
$5.72
$5.72
Yerine koyma ifadeleri hakkında ayrıntılı bilgi için bkz. Normal İfadelerde Yer Değiştirmeler.
Ayrıca bakınız
- about_Operators
- about_Comparison_Operators