about_Regular_Expressions

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, söz diziminin tümü ele alınmaz. 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.

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 olmayan tüm basamaklarla 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

Karakter \w sınıfı herhangi bir sözcük karakteriyle [a-zA-Z_0-9]eşleşecektir. 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şecektir.

# 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 *işareti gibi, öğenin bulunmadığı dizelerle bile eşleşecektir.

# 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 m sayısı arasında n eşleşme.
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'

Bağlayıcılar

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, çift tırnak () yerine" tek tırnak (') kullanarak regex'i kapattığınıza emin olun; aksi takdirde PowerShell ifadeyi değişken olarak genişletir.

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, $ giriş dizesinin başı ve sonu yerine her LINE öğesinin başlangıç ucunu eşleştirmeye 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 \ndahil) 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 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

$MatchesYakalanan 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 $Matches desenin 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. 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-EventLog -LogName Security -Newest 1 -InstanceId 4689).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.com
    
  • Ada 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.

Ayrıca bkz.