about_Regular_Expressions
Deskripsi singkat
Menjelaskan ekspresi reguler di PowerShell.
Deskripsi panjang
Catatan
Artikel ini memperlihatkan sintaksis dan metode untuk menggunakan ekspresi reguler di PowerShell. Ini tidak mencakup semua kemungkinan ekspresi. Untuk referensi yang lebih lengkap, lihat Bahasa Ekspresi Reguler - Referensi Cepat.
Ekspresi reguler adalah pola yang digunakan untuk mencocokkan teks. Ini dapat terdiri dari karakter harfiah, operator, dan konstruksi lainnya.
Artikel ini menunjukkan sintaks ekspresi reguler di PowerShell. PowerShell memiliki beberapa operator dan cmdlet yang menggunakan ekspresi reguler. Anda dapat membaca selengkapnya tentang sintaks dan penggunaannya pada tautan di bawah ini.
Ekspresi reguler PowerShell tidak peka huruf besar/kecil secara default. Setiap metode yang ditunjukkan di atas memiliki cara yang berbeda untuk memaksa sensitivitas kasus.
- Untuk
Select-String
, gunakan parameter CaseSensitive . - Untuk operator yang menggunakan ekspresi reguler, gunakan versi peka huruf besar/kecil:
-cmatch
, ,-creplace
atau-csplit
- Untuk pernyataan,
switch
gunakan-casesensitive
opsi
Harfiah karakter
Ekspresi reguler bisa menjadi karakter harfiah atau string. Ekspresi menyebabkan mesin cocok dengan teks yang ditentukan dengan tepat.
# This statement returns true because book contains the string "oo"
'book' -match 'oo'
Kelas karakter
Meskipun literal karakter berfungsi jika Anda mengetahui pola yang tepat, kelas karakter memungkinkan Anda untuk kurang spesifik.
Grup karakter
[character group]
memungkinkan Anda mencocokkan sejumlah karakter satu kali, sementara [^character group]
hanya cocok dengan karakter YANG TIDAK ada dalam grup.
# This expression returns true if the pattern matches big, bog, or bug.
'big' -match 'b[iou]g'
Jika daftar karakter yang cocok menyertakan karakter tanda hubung (-
), harus berada di awal atau akhir daftar untuk membedakannya dari ekspresi rentang karakter.
Rentang karakter
Pola juga dapat berupa berbagai karakter. Karakter dapat berupa alfabet [A-Z]
, numerik [0-9]
, atau bahkan berbasis [ -~]
ASCII (semua karakter yang dapat dicetak).
# This expression returns true if the pattern matches any 2 digit number.
42 -match '[0-9][0-9]'
Angka
Kelas \d
karakter akan cocok dengan digit desimal apa pun. Sebaliknya, \D
akan cocok dengan digit non-desimal apa pun.
# This expression returns true if it matches a server name.
# (Server-01 - Server-99).
'Server-01' -match 'Server-\d\d'
Karakter kata
Kelas \w
karakter akan cocok dengan karakter [a-zA-Z_0-9]
kata apa pun . Untuk mencocokkan karakter non-kata apa pun, gunakan \W
.
# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'
Wildcard
Titik (.
) adalah karakter kartubebas dalam ekspresi reguler. Ini akan cocok dengan karakter apa pun kecuali baris baru (\n
).
# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'
Whitespace
Anda dapat mencocokkan \s
karakter spasi putih apa pun dengan kelas karakter. Anda dapat mencocokkan karakter non-spasi kosong apa pun dengan \S
. Anda dapat mencocokkan karakter spasi harfiah dengan
.
# 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- '
Pembilang
Pengukur mengontrol berapa banyak instans dari setiap elemen yang harus ada dalam string input.
Berikut ini adalah beberapa kuantifer yang tersedia di PowerShell:
Pembilang | Deskripsi |
---|---|
* |
Nol atau lebih kali. |
+ |
Satu atau beberapa kali. |
? |
Nol atau satu kali. |
{n,m} |
Setidaknya n , tetapi tidak lebih dari m waktu. |
Tanda bintang (*
) cocok dengan elemen sebelumnya nol atau lebih kali. Hasilnya adalah bahwa bahkan string input tanpa elemen akan cocok.
# This returns true for all account name strings even if the name is absent.
'ACCOUNT NAME: Administrator' -match 'ACCOUNT NAME:\s*\w*'
Tanda plus (+
) cocok dengan elemen sebelumnya satu atau beberapa kali.
# This returns true if it matches any server name.
'DC-01' -match '[A-Z]+-\d\d'
Tanda ?
tanya cocok dengan elemen sebelumnya nol atau satu kali. Seperti tanda bintang , ia bahkan akan mencocokkan *
string di mana elemen tidak ada.
# This returns true for any server name, even server names without dashes.
'SERVER01' -match '[A-Z]+-?\d\d'
Kuantifier {n, m}
dapat digunakan beberapa cara berbeda untuk memungkinkan kontrol terperinci atas kuantifier. Elemen m
kedua dan koma ,
bersifat opsional.
Pembilang | Deskripsi |
---|---|
{n} |
Cocokkan jumlah waktu PERSIS n . |
{n,} |
Cocokkan setidaknya n berapa kali. |
{n,m} |
Cocokkan antara n dan m berapa kali. |
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'
Jangkar
Jangkar memungkinkan Anda menyebabkan kecocokan berhasil atau gagal berdasarkan posisi kecocokan dalam string input.
Dua jangkar yang umum digunakan adalah ^
dan $
. Tanda sisipan ^
cocok dengan awal string, dan $
, yang cocok dengan akhir string. Jangkar memungkinkan Anda mencocokkan teks pada posisi tertentu sambil juga membuang karakter yang tidak diinginkan.
# The pattern expects the string 'fish' to be the only thing on the line.
# This returns FALSE.
'fishing' -match '^fish$'
Catatan
Saat menentukan regex yang berisi jangkar ($
), Anda harus mengapit regex dalam tanda kutip tunggal ('
). Jika Anda menggunakan tanda kutip ganda ("
), PowerShell menginterpretasikan string sebagai ekspresi variabel yang dapat diperluas.
Saat menggunakan jangkar di PowerShell, Anda harus memahami perbedaan antara opsi ekspresi reguler Singleline dan Multiline .
- Multibaris: Mode multibaris memaksa
^
dan$
mencocokkan akhir awal setiap LINE, bukan awal dan akhir string input. - Singleline: Mode singleline memperlakukan string input sebagai SingleLine.
Ini memaksa karakter untuk mencocokkan
.
setiap karakter (termasuk baris baru), alih-alih mencocokkan setiap karakter KECUALI baris\n
baru .
Untuk membaca selengkapnya tentang opsi ini dan cara menggunakannya, kunjungi Bahasa Ekspresi Reguler - Referensi Cepat.
Karakter escape
Garis miring terbelakang (\
) digunakan untuk meloloskan karakter sehingga tidak diurai oleh mesin ekspresi reguler.
Karakter berikut dicadangkan: []().\^$|?*+{}
.
Anda harus keluar dari karakter ini dalam pola Anda untuk mencocokkannya dalam string input Anda.
# 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,}'
Ada metode statis dari kelas regex yang dapat menghindari teks untuk Anda.
[regex]::escape('3.\d{2,}')
3\.\\d\{2,}
Catatan
Ini lolos dari semua karakter ekspresi reguler yang dipesan, termasuk garis miring terbelakang yang ada yang digunakan dalam kelas karakter. Pastikan untuk hanya menggunakannya pada bagian pola Anda yang perlu Anda keluarkan.
Karakter lainnya lolos
Ada juga escape karakter khusus yang dapat Anda gunakan untuk mencocokkan jenis karakter khusus.
Berikut ini adalah beberapa escape karakter yang umum digunakan:
Escape Karakter | Deskripsi |
---|---|
\t |
Cocok dengan tab |
\n |
Cocok dengan baris baru |
\r |
Mencocokkan pengembalian gerbong |
Grup, Tangkapan, dan Substitusi
Pembuatan pengelompokan memisahkan string input menjadi substring yang dapat diambil atau diabaikan. Substring yang dikelompokkan disebut subekspresi. Secara default subekspresi diambil dalam grup bernomor, meskipun Anda juga dapat menetapkan nama untuk mereka.
Konstruksi pengelompokan adalah ekspresi reguler yang dikelilingi oleh tanda kurung. Teks apa pun yang cocok dengan ekspresi reguler yang diapit ditangkap. Contoh berikut memecah teks input menjadi dua grup pengambilan.
'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True
$Matches
Gunakan variabel otomatis Hashtable untuk mengambil teks yang diambil.
Teks yang mewakili seluruh kecocokan disimpan di kunci 0
. Penting untuk dicatat bahwa $Matches
hashtable hanya berisi kemunculan pertama dari pola pencocokan apa pun.
$Matches.0
The last logged on user was CONTOSO\jsmith
Pengambilan disimpan dalam kunci Bilangan Bulat numerik yang meningkat dari kiri ke kanan. Pengambilan 1
berisi semua teks hingga nama pengguna, pengambilan 2
hanya berisi nama pengguna.
$Matches
Name Value
---- -----
2 CONTOSO\jsmith
1 The last logged on user was
0 The last logged on user was CONTOSO\jsmith
Penting
Kuncinya 0
adalah Bilangan Bulat. Anda dapat menggunakan metode Hashtable apa pun untuk mengakses nilai yang disimpan.
PS> 'Good Dog' -match 'Dog'
True
PS> $Matches[0]
Dog
PS> $Matches.Item(0)
Dog
PS> $Matches.0
Dog
Pengambilan Bernama
Secara default, pengambilan disimpan dalam urutan numerik naik, dari kiri ke kanan.
Anda juga dapat menetapkan nama ke grup pengambilan. Nama ini menjadi kunci pada $Matches
variabel otomatis Hashtable.
Di dalam grup pengambilan, gunakan ?<keyname>
untuk menyimpan data yang diambil di bawah kunci bernama.
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
Contoh berikut menyimpan entri log terbaru di Log Keamanan Windows. Ekspresi reguler yang disediakan mengekstrak nama pengguna dan domain dari pesan dan menyimpannya di bawah kunci:N untuk nama dan D untuk domain.
$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....
Untuk informasi selengkapnya, lihat Pengelompokan Konstruksi dalam Ekspresi Reguler.
Substitusi dalam Ekspresi Reguler
Menggunakan ekspresi reguler (regex) dengan -replace
operator memungkinkan Anda mengganti teks secara dinamis menggunakan teks yang diambil.
<input> -replace <original>, <substitute>
<input>
: String yang akan dicari<original>
: Ekspresi reguler yang digunakan untuk mencari string input<substitute>
: Ekspresi substitusi regex untuk menggantikan kecocokan yang ditemukan dalam string input.
Operand <original>
dan <substitute>
tunduk pada aturan mesin ekspresi reguler seperti pelepasan karakter atau ekspresi pengganti. Pola penggantian dapat terdiri dari satu atau beberapa substitusi bersama dengan karakter harfiah.
Grup pengambilan dapat direferensikan dalam <substitute>
string menggunakan $
karakter sebelum pengidentifikasi grup.
Dua cara untuk mereferensikan pengambilan grup adalah dengan Angka dan berdasarkan Nama.
Menurut Angka - Menangkap Grup diberi nomor dari kiri ke kanan.
'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'
John.D.Smith@contoso.com
Menurut Nama - Grup Pengambilan juga dapat direferensikan berdasarkan nama.
'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'
FABRIKAM\Administrator
Ekspresi $&
mewakili semua teks yang cocok.
'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble
Peringatan
$
Karena karakter digunakan dalam ekspansi string, Anda harus menggunakan string harfiah dengan substitusi, atau menghindari $
karakter saat menggunakan tanda kutip ganda.
'Hello World' -replace '(\w+) \w+', '$1 Universe'
"Hello World" -replace "(\w+) \w+", "`$1 Universe"
Hello Universe
Hello Universe
Selain itu, jika Anda ingin memiliki $
sebagai karakter harfiah, gunakan $$
alih-alih karakter escape normal. Saat menggunakan tanda kutip ganda, masih lolos dari $
semua instans untuk menghindari penggantian yang salah.
'5.72' -replace '(.+)', '$$$1'
"5.72" -replace "(.+)", "`$`$`$1"
$5.72
$5.72
Untuk informasi terperinci tentang ekspresi substitusi, lihat Substitusi dalam Ekspresi Reguler.