about_Regular_Expressions

Deskripsi singkat

Menjelaskan ekspresi reguler di PowerShell.

Deskripsi panjang

Catatan

Artikel ini akan menunjukkan sintaksis dan metode untuk menggunakan ekspresi reguler di PowerShell, tidak semua sintaks dibahas. 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, , -creplaceatau -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, pastikan untuk mengapit regex menggunakan tanda kutip tunggal (') alih-alih tanda kutip ganda (") atau PowerShell akan memperluas ekspresi sebagai variabel.

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 \nbaru .

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

$MatchesGunakan 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 $Matchesvariabel 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.

Lihat juga