Mam serię zgrupowanych wartości, które mają określony format i chciałbym użyć pojedynczego wyrażenia do przechwycenia ich w grupy. Na przykład, mam -group1 -group2 -group3
i próbuję użyć czegoś podobnego do (-[\s\S]{1,}?)
Jest to w zasadzie pozwala mi przechwycić cały ciąg w jednej grupie, ale chciałbym być w stanie wycofać każdy z tych wartości osobno. Pomyślałem, że ?
zmusiłoby go do braku chciwości, a zatem podzieliłoby wzorzec dopasowania na trzy oddzielne grupy (na przykład). Na razie po prostu powtarzam odwołanie (-[\s\S]*?)
, ale wydaje się, że powinno być bardziej elegancki wyrażenie.
Dzięki!Wyrażenie regularne w celu wybrania powtarzających się grup
Odpowiedz
masz szczęście bo C# jest jednym z kilku języków (jeśli nie jedyny), który obsługuje podwyrażenie przechwytuje
https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.capture(v=vs.110)
.NET API może być postrzegana jako następująco
Matches
Groups (most regex engines stop here)
Captures (unique for .NET)
Z twojego pytania nie wynika, co dokładnie chcesz dopasować, ale to powinno zacząć. Zapytaj ponownie, jeśli utkniesz.
string input = "-group1 -group2 ";
string pattern = @"(-\S*\W){2}";
foreach (Match match in Regex.Matches(input, pattern))
{
Console.WriteLine("Match: {0}", match.Value);
for (int groupCtr = 0; groupCtr < match.Groups.Count; groupCtr++)
{
Group group = match.Groups[groupCtr];
Console.WriteLine(" Group {0}: {1}", groupCtr, group.Value);
for (int captureCtr = 0; captureCtr < group.Captures.Count; captureCtr++)
Console.WriteLine(" Capture {0}: {1}", captureCtr,
group.Captures[captureCtr].Value);
}
}
Ten ouputs
Match: -group1 -group2
Group 0: -group1 -group2
Capture 0: -group1 -group2
Group 1: -group2
Capture 0: -group1
Capture 1: -group2
Jak widać (Grupa 1, przechwytywania 0) i (Grupa 1, Przechwytywanie 1) oferują poszczególne zrzuty z grupy (i nie ostatni jak w większości języki)
Ten adres myślę o tym, co można opisać jako „aby móc wsteczne każdej z wartości oddzielnie”
(użyć wstecznych okres, ale nie sądzę, jesteś dążenie do AR wzór wyrównania prawy?)
+1. Wierzę, że o to też prosił. Na marginesie PHP oferuje to z '' preg_match_all (...) '' funkcja; za pomocą flagi 'PREG_SET_ORDER'' zwraca tablicę wielowymiarową, pierwszą tablicę zawierającą pierwszy zbiór, drugą tablicę zawierającą drugi zestaw itd. (Inne flagi zezwalają na różne reprezentacje). Domyślam się, że jeśli .NET i PHP to zaimplementowało, mają też inne języki. –
@ acheong87 Dobry komentarz, dodam go do odpowiedzi, aby nie obrażać innych języków :) Mam to od eksperta od regexp Jana Goyvaertsa, że .NET był wyjątkowy w tym aspekcie, ale nie jestem wystarczająco aktywny na innych platformach, aby to poprzeć w górę. – buckley
@ acheong87, to nie to samo. 'preg_match_all()' stosuje wielokrotnie wyrażenie regularne i zwraca zebrane wyniki, podobne do metody 'Matches()' .NET. OP chce wykonać * jeden * mecz, który pochłonie cały ciąg, a następnie wydzieli pojedyncze przechwyty. .NET zapewnia 'CaptureCollection' w tym celu, ale PHP nie ma odpowiednika. –
Spróbuj tego:
(-.+?)(\s|$)
Twoja pierwsza grupa przechwytywania będzie mieć, co chcesz (-group1
, -group2
, etc).
Jeśli chcesz mieć większą kontrolę nad tym, co pozwoli po -
zmień .+?
do, na przykład, [a-zA-Z0-9]+?
tylko dopasować znaki alfanumeryczne.
Z regex .NET (i prawie tylko .NET) można użyć:
(?:(-\S+)\s*)+
Grupa 1 będzie zawierać listę wszystkich dopasowanych podciągów.
A może po prostu za pomocą Matches
jest wystarczająca w przypadku:
var re = new Regex(@"-\S+");
var matches = re.Matches(str);
- 1. wyrażenie regularne dla kolejnych powtarzających się słów
- 2. Wyrażenie regularne w celu wybrania całego wiersza zawierającego klasę HTML
- 3. Wyrażenie regularne VBA, zastępowanie grup
- 4. Wyrażenie regularne z wyprzedzeniem - Identyfikacja powtarzających się kolejnych liter
- 5. Wyrażenie regularne w celu dopasowania "|"
- 6. Pisanie wyrażeń regularnych w celu wykrycia powtarzających się znaków
- 7. regularne wyrażenie: jak wykluczyć wiele grup znaków?
- 8. Jak przechwytywać wiele powtarzających się grup?
- 9. Wyrażenie regularne w celu wyszukania spacji
- 10. Wyrażenie regularne w celu ograniczenia liczby znaków do 10
- 11. Wyrażenie regularne w celu dopasowania tylko nieparzystej lub parzystej liczby
- 12. wyrażenie regularne w iOS
- 13. Wyrażenie regularne w celu uzyskania atrybutu ze znacznika HTML
- 14. Wyrażenie regularne w celu ograniczenia długości ciągu znaków
- 15. Wyrażenie regularne w celu sprawdzenia, czy ciąg zawiera tylko zera
- 16. Wyrażenie regularne w celu dopasowania dokładnego słowa - wyróżnienie ciągu wyszukiwania
- 17. Wyrażenie regularne w celu usunięcia podłańcucha między dwoma znakami
- 18. Przykładowy projekt w celu wybrania wielu kontaktów
- 19. Wyrażenie regularne negatywne mecz
- 20. debugowania Perl Wyrażenie regularne
- 21. Wyrażenie regularne Wildcard Matching
- 22. Wyrażenie regularne obciąć ciąg
- 23. email wyrażenie regularne
- 24. Wyrażenie regularne w skrypcie Bash
- 25. Wyrażenie regularne w funkcji indeksu
- 26. Wyrażenie regularne równoważne chomp
- 27. Python string.replace wyrażenie regularne
- 28. Wyrażenie regularne lookbehind problemem
- 29. c Wyrażenie regularne howto
- 30. Wyrażenie regularne zastępuje
Jest to nieco niejasne. Czy możesz pokazać przykładowy tekst i oczekiwany wynik grupowania, łącznie z tym, co chcesz odzyskać? –
Nawiasem mówiąc, '[\ s \ S]' mówi "Dopasuj dowolną spację lub nie-spację". Pomyśl o tym. ;) – qJake