Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Kısa açıklama
PowerShell'de normal ifadeleri açıklar.
Uzun açıklama
Not
Bu makalede, PowerShell'de normal ifadeleri kullanmaya yönelik söz dizimi ve yöntemleri gösterilir. Tüm olası ifadeleri kapsamaz. Daha eksiksiz bir başvuru için bkz . Normal İfade Dili - Hızlı Başvuru.
Normal ifade, metin eşleştirmek için kullanılan bir desendir. Değişmez karakterlerden, işleçlerden ve diğer yapılardan oluşabilir. PowerShell .NET regex altyapısını kullanır.
Bu makalede PowerShell'de normal ifade söz dizimi gösterilmektedir. PowerShell'de normal ifadeler kullanan çeşitli işleçler ve cmdlet'ler vardır. Söz dizimi ve kullanımı hakkında daha fazla bilgiyi aşağıdaki bağlantılardan okuyabilirsiniz.
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ı zorlamak için farklı bir yolu vardır.
- için
Select-StringCaseSensitive parametresini kullanın. - Normal ifadeler kullanan işleçler için büyük/küçük harfe duyarlı sürümü kullanın:
-cmatch,-creplaceveya-csplit - deyimi için
switchşu seçeneği kullanın:-CaseSensitive
Karakter değişmez değerleri
Normal ifade değişmez bir karakter veya dize olabilir. İfade, altyapının 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 deseni biliyorsanız karakter değişmez değerleri işe yarasa da, karakter sınıfları daha az belirgin olmanıza olanak tanır.
Karakter grupları
[character group] , herhangi bir sayıda karakteri bir kez eşleştirmenizi sağlarken [^character group] , yalnızca gruptaKI DEĞİl karakterlerle eşleşir.
# This expression returns true if the pattern matches big, bog, or bug.
'big' -match 'b[iou]g'
Eşleştirilecek karakter listenizde kısa çizgi karakteri ()- varsa, karakter aralığı ifadesinden ayırt etmek için listenin başında veya sonunda olması gerekir.
Karakter aralıkları
Desen bir karakter aralığı da olabilir. Karakterler alfabetik [A-Z], sayısal [0-9], hatta ASCII tabanlı [ -~] (tüm yazdırılabilir karakterler) olabilir.
# This expression returns true if the pattern matches any 2 digit number.
42 -match '[0-9][0-9]'
Numaralar
Karakter \d sınıfı herhangi bir ondalık basamakla eşleşir. Buna karşılık, \D ondalık basamaklar dışında herhangi bir karakterle eşleşir.
# This expression returns true if it matches a server name.
# (Server-01 - Server-99).
'Server-01' -match 'Server-\d\d'
Sözcük karakterleri
\w karakter sınıfı, [a-zA-Z_0-9]herhangi bir sözcük karakteriyle eşleşir. Sözcük olmayan herhangi bir karakterle eşleştirmek için kullanın \W.
# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'
Joker karakterler
Nokta (.), normal ifadelerde 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 '....'
Whitespace
Herhangi bir boşluk karakterini karakter sınıfıyla \s eşleştirebilirsiniz. Boşluk olmayan herhangi bir karakteri ile \Seşleştirebilirsiniz. Sabit 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- '
Miktar Niceleyiciler
Niceleyiciler, giriş dizesinde her öğenin kaç örneğinin bulunması gerektiğini denetler.
PowerShell'de kullanılabilen niceleyicilerden birkaçı şunlardır:
| Miktar Niceleyici | Açıklama |
|---|---|
* |
Sıfır veya daha fazla kez. |
+ |
Bir veya daha fazla kez. |
? |
Sıfır veya bir kerelik. |
{n,m} |
En azından n, ama en fazla m kez. |
Yıldız işareti (*), önceki öğeyle sıfır veya daha fazla kez eşleşir. Sonuç, öğesi olmayan bir giriş dizesinin bile eşleşmesi olur.
# 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 sıfır veya bir kerelik öğeyle eşleşir. Yıldız *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'
Niceleyici {n, m} , niceleyici üzerinde ayrıntılı denetime izin vermek için birkaç farklı yolla kullanılabilir. İkinci öğe m ve virgül , isteğe bağlıdır.
| Miktar Niceleyici | Açıklama |
|---|---|
{n} |
TAM olarak n kaç kez eşleştirin. |
{n,} |
EN AZ n kaç kez eşleştirin. |
{n,m} |
ve n sayısı arasında m eşleşme. |
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'
Çapa
Tutturucular, giriş dizesi içindeki eşleşme konumuna göre eşleşmenin başarılı veya başarısız olmasına neden olmanıza olanak sağlar.
Yaygın olarak kullanılan iki yer işareti ve ^şeklindedir$. Şapka işareti ^ bir dizenin başlangıcıyla ve $dizenin sonuyla eşleşir. Tutturucular, metninizi belirli bir konumda eşleştirirken istenmeyen karakterleri de atmanızı sağlar.
# The pattern expects the string 'fish' to be the only thing on the line.
# This returns FALSE.
'fishing' -match '^fish$'
Not
Yer işareti ($ ) içeren bir regex tanımlarken, regex'i tek tırnak içine almanız gerekir (' ). Çift tırnak ()" kullanırsanız, PowerShell dizeyi genişletilebilir değişken ifadesi olarak yorumlar.
PowerShell'de yer işaretleri kullanırken Tek Satırlı ve Çok Satırlı normal ifade seçenekleri arasındaki farkı anlamanız gerekir.
-
Çok Satırlı: Çok satırlı mod,
^ve$'ü giriş dizisinin başı ve sonu yerine her satırın başlangıcı ve sonuyla eşleşmeye zorlar. -
Tek satırlı: Tek satır modu, giriş dizesini Tek Satır olarak değerlendirir.
Karakteri, yeni satır HARIÇ her karakteri eşleştirmek yerine her karakterle (yeni satırlar
.dahil) eşleşmeye zorlar\n.
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 adresini ziyaret edin.
Kaçış karakterleri
Ters eğik çizgi (\), karakterleri normal ifade altyapısı tarafından ayrıştırmamak için kullanılır.
Aşağıdaki karakterler ayrılmıştır: [().\^$|?*+{.
Giriş dizelerinizde bunları eşleştirmek için desenlerinizdeki bu karakterlerden kurtulmanı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çış yapmanız gereken kısmında kullandığınızdan emin olun.
Diğer karakter kaçışları
Özel karakter türlerini eşleştirmek için kullanabileceğiniz ayrılmış karakter kaçışları da vardır.
Yaygın olarak kullanılan birkaç karakter kaçışı şunlardır:
| Karakter Kaçışı | Açıklama |
|---|---|
\t |
Sekmeyle eşleşir |
\n |
Yeni satırla eşleşir |
\r |
Satır başıyla eşleşir |
Gruplar, yakalamalar ve değiştirmeler
Gruplandırma yapıları, bir giriş dizesini yakalanabilen veya yoksayılabilir alt dizelere ayırır. Gruplandırılmış alt dizeler alt ifadeler olarak adlandırılır. Varsayılan olarak alt ifadeler numaralandırılmış gruplarda yakalanır, ancak bunlara da ad atayabilirsiniz.
Gruplandırma yapısı, parantezlerle çevrili normal bir ifadedir. Kapalı normal ifadeyle eşleşen tüm metinler yakalanır. Aşağıdaki örnek, giriş metnini iki yakalama grubuna böler.
'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True
$Matches
Yakalanan metni almak için Hashtable otomatik değişkenini kullanın.
Eşleşmenin tamamını temsil eden metin anahtarında 0depolanır. Karma tablo, eşleşen herhangi bir desenin $Matches yalnızca ilk geçtiği yeri içerir.
$Matches.0
The last logged on user was CONTOSO\jsmith
Yakalamalar, soldan sağa doğru artan sayısal Tamsayı anahtarlarında depolanır. Yakalama 1 , kullanıcı adı, yakalama 2 yalnızca kullanıcı adını içerene kadar tüm metni içerir.
$Matches
Name Value
---- -----
2 CONTOSO\jsmith
1 The last logged on user was
0 The last logged on user was CONTOSO\jsmith
Önemli
Anahtar 0 bir Tamsayıdır. Depolanan 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
Varsayılan olarak, yakalamalar soldan sağa doğru artan sayısal sırada depolanır.
Bir yakalama grubuna ad da atayabilirsiniz. Bu ad Hashtable otomatik değişkeninde $Matchesanahtar haline gelir.
Bir yakalama grubunun içinde, yakalanan verileri adlandırılmış bir anahtar altında depolamak için kullanın ?<keyname> .
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 girdisini Windows Güvenliği Günlüğü'nde depolar. Sağlanan normal ifade, iletiden kullanıcı adını ve etki alanını ayıklar ve bunları ad için N ve etki alanı için D anahtarları altında depolar.
$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 İfadelerdeki Değişimler
Normal ifadeleri (regex) işleciyle -replace birlikte 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 bir regex değiştirme ifadesi.
<original> ve <substitute> işlenenleri, normal ifade altyapısının karakter kaçışı veya değiştirme ifadeleri gibi kurallarına tabidir. Değiştirme deseni, değişmez karakterlerin yanı sıra bir veya birden çok değiştirmeden oluşabilir.
Yakalama gruplarına, grup tanımlayıcısının <substitute> önceki karakteri kullanılarak $ dizede başvurulabilir.
Yakalama gruplarına başvurmanın iki yolu Sayı ve Ada göredir.
Sayıya Göre - Yakalama Grupları soldan sağa numaralandırılır.
'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'John.D.Smith@contoso.comAda Göre - Yakalama Gruplarına ada göre de başvurulabilir.
'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'FABRIKAM\Administrator
İfade, $& eşleşen tüm metni temsil eder.
'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble
Uyarı
Karakter dize genişletmede kullanıldığından $ , değişmez dizeleri değiştirme ile kullanmanız veya çift tırnak işareti kullanırken karakterden $ kaçış yapmanız gerekir.
'Hello World' -replace '(\w+) \w+', '$1 Universe'
"Hello World" -replace "(\w+) \w+", "`$1 Universe"
Hello Universe
Hello Universe
Ayrıca, sabit karakter olarak kullanmak $ istiyorsanız, normal kaçış karakterleri yerine kullanın $$ . Çift tırnak işareti kullanırken, yanlış değiştirmeden kaçınmak için yine de öğesinin $ tüm örneklerinden kaçın.
'5.72' -replace '(.+)', '$$$1'
"5.72" -replace "(.+)", "`$`$`$1"
$5.72
$5.72
Değiştirme ifadeleri hakkında ayrıntılı bilgi için bkz . Normal İfadelerde Değiştirmeler.
Normal ifadelerdeki açıklamalar
Normal ifadeler çok karmaşık ve okunmak zor olabilir. Açıklamaları daha anlaşılır hale getirmek için kullanabilirsiniz. Normal ifadelerde izin verilen iki tür açıklama vardır.
- Satır içi açıklama (
(?#)) - Satır sonu açıklaması (
#)
Daha fazla bilgi için Normal ifade açıklamaları bölümüne, about_Commentsbakın.
Ayrıca bakınız
PowerShell