Trudno mi znaleźć dobry zasób, który wyjaśnia, jak używać nazwanych grup przechwytywania w języku C #. Oto kod, który mam do tej pory:
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());
Jednak zawsze pokazuje to tylko pełną linię:
<td><a href="/path/to/file">Name of File</a></td>
Eksperymentowałem z kilkoma innymi „metodami”, które znalazłem na różnych stronach internetowych, ale ciągle otrzymuję ten sam rezultat.
Jak mogę uzyskać dostęp do nazwanych grup przechwytywania, które są określone w moim wyrażeniu regularnym?
<>
spowoduje to jej uszkodzenie. W(?'link'.*)
takim przypadku możesz użyć . Nie do końca związane z tym pytaniem, ale wylądowałem tutaj podczas wyszukiwania w Google „.net nazwanych grup przechwytywania”, więc jestem pewien, że inni ludzie też…<>
will go nie złamie. Udało mi się użyćmyRegex.GetGroupNames()
kolekcji jako nazw elementów XML.Odpowiedzi:
Użyj kolekcji grupowej obiektu Dopasuj, indeksując go nazwą grupy przechwytywania, np
źródło
var m
, ponieważ byłoby toobject
.Określony ciąg grupy przechwytywania określa się, przekazując go do indeksu
Groups
właściwościMatch
obiektu wynikowego .Oto mały przykład:
źródło
Poniższy przykładowy kod będzie pasował do wzorca nawet w przypadku spacji pomiędzy nimi. tj .:
jak również:
Metoda zwraca true lub false, w zależności od tego, czy wejściowy ciąg htmlTd pasuje do wzorca, czy nie. Jeśli pasuje, parametry wyjściowe zawierają odpowiednio link i nazwę.
Przetestowałem to i działa poprawnie.
źródło
${1}
aby wszystko było jeszcze prostsze.Dodatkowo, jeśli ktoś ma przypadek użycia, w którym potrzebuje nazw grup przed wykonaniem wyszukiwania na obiekcie Regex, może użyć:
źródło
Te odpowiedzi poprawiają odpowiedź Rashmi Pandit , która jest w pewnym sensie lepsza niż reszta, ponieważ wydaje się, że całkowicie rozwiązuje dokładny problem opisany w pytaniu.
Złą stroną jest to, że jest nieefektywne i nie korzysta konsekwentnie z opcji IgnoreCase.
Nieefektywna część polega na tym, że wyrażenie regularne może być kosztowne w budowie i wykonaniu, a w tej odpowiedzi można go było zbudować tylko raz (wywołanie
Regex.IsMatch
polegało na ponownym utworzeniu wyrażenia regularnego za sceną). IMatch
metoda mogła zostać wywołana tylko raz i zapisana w zmiennej, a następnie powinnalink
iname
powinna zostać wywołanaResult
z tej zmiennej.I opcja IgnoreCase była używana tylko w
Match
części, ale nie wRegex.IsMatch
części.Przesunąłem również definicję Regex poza metodę, aby skonstruować ją tylko raz (myślę, że to rozsądne podejście, jeśli przechowujemy ten zestaw z
RegexOptions.Compiled
opcją).źródło