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-String
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
,-creplace
veya-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 \S
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:
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
\n
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 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 0
depolanı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 $Matches
anahtar 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.
PowerShell
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin