Bagikan melalui


tentang_Ekspresi_Reguler

Deskripsi singkat

Menguraikan ekspresi reguler pada PowerShell.

Deskripsi panjang

Nota

Artikel ini memperlihatkan sintaksis dan metode untuk menggunakan ekspresi reguler di PowerShell. Ini tidak mencakup semua kemungkinan ekspresi. Untuk referensi yang lebih lengkap, lihat Regular Expression Language - Quick Reference.

Ekspresi reguler adalah pola yang digunakan untuk mencocokkan teks. Ini dapat terdiri dari karakter harfiah, operator, dan struktur lainnya. PowerShell menggunakan mesin regex .NET .

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 membedakan 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 opsi -CaseSensitive

Harfiah karakter

Ekspresi reguler bisa menjadi karakter harfiah atau string. Pernyataan tersebut menginstruksikan mesin untuk mencocokkan teks yang sudah 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 ingin mencocokkan menyertakan karakter tanda hubung (-), itu harus berada baik di awal maupun di akhir daftar untuk membedakannya dari ekspresi rentang karakter.

Rentang karakter

Pola juga dapat berupa berbagai karakter. Karakter dapat berupa [A-Z]alfabet, [0-9]numerik, 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]'

Jumlah

Kelas \d karakter cocok dengan digit desimal apa pun. Sebaliknya, \D cocok dengan karakter apa pun kecuali digit desimal.

# This expression returns true if it matches a server name.
# (Server-01 - Server-99).
'Server-01' -match 'Server-\d\d'

Karakter kata

Kelas karakter \w cocok dengan karakter kata apa pun [a-zA-Z_0-9]. Untuk mencocokkan karakter non-kata apa pun, gunakan \W.

# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'

Karakter Pengganti

Titik (.) adalah karakter pengganti dalam ekspresi reguler. Ini cocok dengan karakter apa pun kecuali garis baru (\n).

# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'

Spasi

Anda dapat mencocokkan karakter spasi putih apa pun dengan kelas karakter \s. Anda dapat mencocokkan karakter non-spasi kosong apa pun dengan \S. Anda dapat mencocokkan karakter spasi literal 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- '

Kuantifier

Pengukur mengontrol berapa banyak instans dari setiap elemen yang harus ada dalam string input.

Berikut ini adalah beberapa kuantifer yang tersedia di PowerShell:

Kuantifier Deskripsi
* Nol kali atau lebih.
+ Satu atau beberapa kali.
? Nol atau satu kali.
{n,m} Setidaknya n, tetapi tidak lebih dari m kali.

Asterisk (*) mencocokkan elemen sebelumnya nol atau lebih banyak 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 ? sesuai dengan elemen sebelumnya sebanyak nol atau satu kali. Seperti tanda bintang *, ia bahkan cocok dengan 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 kedua m dan , koma bersifat opsional.

Kuantifier Deskripsi
{n} Cocokkan tepat n kali.
{n,} Cocokkan setidaknya n kali.
{n,m} Sesuaikan antara n dan m kali.
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'

Jangkar

Jangkar memungkinkan Anda untuk menentukan apakah kecocokan berhasil atau gagal berdasarkan posisi kecocokan dalam string input.

Dua jangkar yang umum digunakan adalah ^ dan $. Simbol caret ^ cocok dengan awal string, dan $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$'

Nota

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 penanda di PowerShell, Anda harus memahami perbedaan antara opsi ekspresi reguler Singleline dan Multiline.

  • multiline: Mode multibaris memaksa ^ dan $ mencocokkan awal dan akhir setiap baris alih-alih 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 baru \n.

Untuk membaca selengkapnya tentang opsi ini dan cara menggunakannya, kunjungi Bahasa Ekspresi Reguler - Referensi Cepat.

Karakter pelepasan

Tanda garis miring terbalik (\) digunakan untuk menghindari karakter sehingga tidak diurai oleh pengolah ekspresi reguler.

Karakter berikut dicadangkan: [().\^$|?*+{.

Anda perlu meng-escape karakter-karakter ini dalam pola Anda agar dapat 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,}

Nota

Ini meloloskan semua karakter ekspresi reguler terproteksi, termasuk tanda garis miring terbalik yang ada yang digunakan dalam kelas karakter. Pastikan untuk hanya menggunakannya pada bagian pola Anda yang perlu di-"escape".

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 bawaan, subekspresi diambil dalam kelompok 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 oleh tanda kurung akan ditangkap. Contoh berikut memecah teks input menjadi dua grup pengambilan.

'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True

Gunakan $MatchesHashtable variabel otomatis untuk mengambil teks yang diambil. Teks yang mewakili keseluruhan kecocokan disimpan pada kunci 0. Penting untuk dicatat bahwa hashtable $Matches hanya berisi kemunculan pertama dari pola pencocokan apa pun.

$Matches.0
The last logged on user was CONTOSO\jsmith

Tangkapan disimpan dalam kunci bilangan bulat numerik yang meningkat dari kiri ke kanan. Tangkap 1 berisi semua teks hingga nama pengguna, ambil 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

Kunci 0 adalah Bilangan Bulat. Anda dapat menggunakan metode hashtable untuk mengakses nilai yang disimpan.

PS> 'Good Dog' -match 'Dog'
True

PS> $Matches[0]
Dog

PS> $Matches.Item(0)
Dog

PS> $Matches.0
Dog

Penangkapan Bernama

Secara bawaan, tangkapan layar disimpan dalam urutan numerik naik, dari kiri ke kanan. Anda juga dapat menetapkan nama ke kelompok tangkapan. Nama ini menjadi kunci pada variabel otomatis $MatchesHashtable otomatis.

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 Konstruksi Pengelompokan dalam Ekspresi Reguler.

Substitusi dalam Ekspresi Reguler

Menggunakan ekspresi reguler (regex) dengan operator -replace 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 mengganti kecocokan yang ditemukan dalam string input.

Operand <original> dan <substitute> tunduk pada aturan mesin ekspresi reguler seperti ekspresi pelepasan karakter atau penggantian. Pola penggantian dapat terdiri dari satu atau beberapa substitusi bersama dengan karakter harfiah.

Grup pengambilan dapat dirujuk dalam string <substitute> dengan menggunakan karakter $ sebelum pengidentifikasi grup.

Dua cara untuk mereferensikan grup pengambilan adalah dengan Nomor dan dengan nama .

  • "Berdasarkan Angka - Grup Tangkap dinomori 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 literal 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, tetap gunakan escape untuk semua instans $ untuk mencegah 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.

Komentar dalam ekspresi reguler

Ekspresi reguler bisa sangat kompleks dan sulit dibaca. Anda dapat menggunakan komentar untuk membuatnya lebih mudah dimengerti. Ada dua jenis komentar yang diizinkan dalam ekspresi reguler.

  • Komentar sebaris ((?#))
  • Komentar akhir baris (#)

Untuk informasi selengkapnya, lihat bagian komentar ekspresi reguler dari about_Comments.

Lihat juga