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.
-
Select-Stringiçin CaseSensitive 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 -
switchdeyimi için-CaseSensitiveseçeneğini kullanın
Karakter değişmez değerleri
Düzenli ifade, sabit bir karakter veya bir dize olabilir. İfade, motorun belirtilen metinle tam olarak eşleşmesini sağlar.
# 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 ayrıntıya girebilmenizi sağlar.
Karakter grupları
[character group], herhangi bir sayıda karakteri bir kez eşleştirmenize olanak tanırken, [^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şecek karakter listenize kısa çizgi karakteri (-) ekliyse, karakter aralığı ifadesinden ayırt etmek için listenin başında veya sonunda olmalıdır.
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]'
Sayılar
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 karakteri eşleştirmek için \Wkullanın.
# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'
Joker karakterler
Nokta (.), normal ifadelerdeki 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 \Sile eş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:
| Niceleyici | Açıklama |
|---|---|
* |
Sıfır veya daha fazla kez. |
+ |
Bir veya daha fazla kez. |
? |
Sıfır veya bir kez. |
{n,m} |
En az n, ancak en fazla m kez. |
Yıldız işareti (*), önceki öğeyle sıfır veya daha fazla kez eşleşir. Sonuç olarak, öğesi olmayan bir giriş dizesi bile uyum sağlar.
# 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. Asterik *gibi, hatta öğenin bulunmadığı dizelerle eşleşir.
# This returns true for any server name, even server names without dashes.
'SERVER01' -match '[A-Z]+-?\d\d'
{n, m} niceleyici, 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.
| Niceleyici | Açıklama |
|---|---|
{n} |
TAM olarak kaç kez n eşleştirin. |
{n,} |
En az n kez eşleşme yapın. |
{n,m} |
n ile m sayısı arasında 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 $. Şapka işareti ^ bir dizenin başlangıcıyla eşleşir ve $ise 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ımladığınızda, regex'i tek tırnak içinde yazmalısınız ('). Ç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ı ile Çok Satırlı normal ifade seçenekleri arasındaki farkı anlamanız gerekir.
-
Çok Satırlı: Çok Satırlı mod,
^ve$'ü, giriş dizesinin başı ve sonu yerine her satırın başı ve sonuyla eşleşmeye zorlar. -
Tek Satırlı: Tek satır modu, giriş dizesini SingleLineolarak değerlendirir.
.karakterini, yeni satırlar dahil her karakterle eşleşmeye zorlar, yeni satır\nhariç her karakterle eşleşmesi yerine.
Bu seçenekler ve bunların nasıl kullanılacağı hakkında daha fazla bilgi edinmek için Normal İfade Dili - Hızlı Başvuruadresini ziyaret edin.
Kaçış karakterleri
Ters eğik çizgi (\) karakterlerin normal ifade motoru tarafından ayrıştırılmaması için kaçış karakteri olarak 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ı
Kullanabileceğiniz özel ayrılmış karakter kaçışları da vardır, bunlar özel karakter türlerini eşleştirmek içindir.
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. Köşeli parantez içinde verilen normal ifadeye uygun gelen 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 $MatchesHashtable otomatik değişkenini kullanın.
Eşleşmenin tamamını temsil eden metin 0anahtarında depolanır.
$Matches hashtable'ının eşleşen desenlerin yalnızca ilk oluşumunu içerdiğini unutmayın.
$Matches.0
The last logged on user was CONTOSO\jsmith
Yakalamalar, soldan sağa doğru artan sayısal Tamsayı anahtarlarında depolanır. Doküman 1, kullanıcı adına kadar olan tüm metni içerir, doküman 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
Önemli
0 anahtarı bir Tamsayı. 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ı, $MatchesHashtable otomatik değişkeninde anahtar olarak kullanılır.
Bir yakalama grubunun içinde, yakalanan verileri adlandırılmış bir anahtar altında depolamak için ?<keyname> kullanın.
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üvenlik Günlüğü'nde depolar. Sağlanan normal ifade, iletiden kullanıcı adını ve etki alanını ayıklar ve bunları anahtarlar altında depolar: ad içinN ve etki alanı 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 Gruplandırma Yapıları.
Normal İfadelerdeki Değişimler
normal ifadeleri (regex) -replace işleciyle 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> operandları, normal ifade motorunun karakter kaçışları veya değiştirme ifadeleri gibi kurallarına tabidir. Değiştirme düzeni, sabit karakterlerle birlikte bir veya daha fazla değiştirmeden oluşabilir.
Yakalama gruplarına, grup tanımlayıcıdan önceki <substitute> karakteri kullanılarak $ dizesinde başvurulabilir.
Yakalama gruplarına başvurmanın iki yolu, Sayı ve Adiledir.
Sayı - 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.comİsme göre - yakalama gruplarına isme göre de başvurabilirsiniz.
'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ı
dize genişletmesinde $ karakteri kullanıldığından, değişmez dizeleri değiştirme ile kullanmanız veya çift tırnak işareti kullanırken $ karakterinden kaçış yapmanız gerekir.
'Hello World' -replace '(\w+) \w+', '$1 Universe'
"Hello World" -replace "(\w+) \w+", "`$1 Universe"
Hello Universe
Hello Universe
Ayrıca, $'ı harfi 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 $ tüm örneklerinden yine de 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 about_Commentsbölümündeki Normal ifade açıklamaları kısmına bakın.
Ayrıca bakınız
PowerShell