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-String iç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, -creplace veya -csplit
  • switch ifadesi 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, ancak m defadan 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 n sayıda eşleştirin.

{n,}

EN AZ n sayıda eşleştirin.

{n,m}

n ile m sayı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, \n yeni 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:

\t

Bir sekmeyle eşleşir

\n

Yeni satırla eşleşir

\r

Bir 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 ? öğesini 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 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

İlgili makaleler