Saya mengalami kesulitan menemukan sumber daya yang bagus yang menjelaskan cara menggunakan Grup Pengambilan Nama di C #. Ini adalah kode yang saya miliki sejauh ini:
string page = Encoding.ASCII.GetString(bytePage);
Regex qariRegex = new Regex("<td><a href=\"(?<link>.*?)\">(?<name>.*?)</a></td>");
MatchCollection mc = qariRegex.Matches(page);
CaptureCollection cc = mc[0].Captures;
MessageBox.Show(cc[0].ToString());
Namun ini selalu menunjukkan baris penuh:
<td><a href="/path/to/file">Name of File</a></td>
Saya telah bereksperimen dengan beberapa "metode" lain yang saya temukan di berbagai situs web tetapi saya tetap mendapatkan hasil yang sama.
Bagaimana saya bisa mengakses grup penangkap bernama yang ditentukan dalam regex saya?
<>
akan memecahnya. Anda dapat menggunakannya(?'link'.*)
sebagai gantinya dalam hal ini. Tidak sepenuhnya relevan dengan pertanyaan ini, tetapi saya mendarat di sini dari pencarian Google ".net named capture groups" jadi saya yakin orang lain juga ...<>
itu tidak akan merusaknya . Saya bisa menggunakanmyRegex.GetGroupNames()
koleksi sebagai nama elemen XML.Jawaban:
Gunakan koleksi grup objek Match, mengindeksnya dengan nama grup capturing, mis
sumber
var m
, karena itu akan menjadiobject
.Anda menentukan string grup penangkap bernama dengan meneruskannya ke pengindeks
Groups
properti dariMatch
objek yang dihasilkan .Ini adalah contoh kecil:
sumber
Contoh kode berikut, akan cocok dengan pola bahkan dalam kasus karakter spasi di antaranya. yaitu:
sebaik:
Metode mengembalikan benar atau salah, tergantung pada apakah string htmlTd input cocok dengan pola atau tidak. Jika cocok, params masing-masing berisi tautan dan nama.
Saya telah menguji ini dan berfungsi dengan benar.
sumber
${1}
hal-hal yang lebih sederhana.Selain itu jika seseorang memiliki use case di mana ia membutuhkan nama grup sebelum melakukan pencarian pada objek Regex yang dapat ia gunakan:
sumber
Jawaban ini meningkat pada jawaban Rashmi Pandit , yang jauh lebih baik daripada yang lain karena tampaknya menyelesaikan masalah yang tepat yang terinci dalam pertanyaan.
Bagian buruknya adalah tidak efisien dan tidak menggunakan opsi IgnoreCase secara konsisten.
Bagian yang tidak efisien adalah karena regex bisa mahal untuk dibangun dan dieksekusi, dan dalam jawaban itu bisa dibangun hanya sekali (pemanggilan
Regex.IsMatch
hanya membangun regex lagi di belakang layar). DanMatch
metode bisa dipanggil hanya sekali dan disimpan dalam variabel dan kemudianlink
danname
harus memanggilResult
dari variabel itu.Dan opsi IgnoreCase hanya digunakan di
Match
bagian tetapi tidak diRegex.IsMatch
bagian.Saya juga memindahkan definisi Regex di luar metode untuk membangunnya sekali saja (saya pikir adalah pendekatan yang masuk akal jika kita menyimpan bahwa perakitan dengan
RegexOptions.Compiled
opsi).sumber