Jak dopasować łączniki do wyrażenia regularnego?


83

Jak przepisać [a-zA-Z0-9!$* \t\r\n]wzór, aby dopasować łącznik do istniejących znaków?


zamiast dodawać spację i \ t możesz dodać \ s. \ s pasuje również do innych typów białych
znaków

Odpowiedzi:


72

Uniknij łącznika.

[a-zA-Z0-9!$* \t\r\n\-]

UPDATE :
Nieważne tę odpowiedź - ty możesz dodać łącznik do grupy, ale nie masz do niego uciec. Zobacz zamiast tego odpowiedź Konrada Rudolpha, która znacznie lepiej odpowiada i wyjaśnia dlaczego.


Och to jest? Czy to dlatego, że jest w grupie postaci? Mój błąd.
Neil Barnwell

11
@KonradRudolph Masz rację, ale nie jestem pewien, czy wersja bez zmiany znaczenia jest łatwiejsza do zrozumienia. Dwa możliwe zastosowania myślnika są mylące, dlatego na początek pojawiają się pytania na ten temat. Z pewnością jest bardziej elegancki, gdy się o nim dowiesz, ale dla początkujących jest nieco zagmatwany.
Christophe Roussy

186

W wyrażeniach regularnych łącznik jest zwykle normalnym znakiem. Tylko wtedy, gdy jest w klasie postaci i między dwoma innymi postaciami, ma specjalne znaczenie.

A zatem:

  • [-] dopasowuje myślnik.
  • [abc-]mecze a, b, club myślnik.
  • [-abc]mecze a, b, club myślnik.
  • [ab-d]mecze a, b, club d( tylko tu myślnik oznacza szereg znaków).

1
@rrr Chcesz, żeby napisał to dla Ciebie, a także przeliterował? Wszystko, co musisz zrobić, to dodać łącznik do grupy.
Neil Barnwell

10
@rrrr: Wierzę, że udzieliłem odpowiedzi. Pytanie brzmiało „jak napisać„ X ”…” i uważam, że wyjaśniłem, jak to zrobić. Skorzystanie z mojej odpowiedzi i zastosowanie wyjaśnienia do rzeczywistego wyrażenia nie powinno wymagać więcej umiejętności poznawczych niż są wymagane od pierwszej klasy. W rzeczywistości jest to dokładnie to , czego uczą się pierwszoklasiści, gdy uczą się podstaw arytmetyki. Zapraszam do poprawienia mojego przypuszczenia.
Konrad Rudolph


2
@MarkP Cóż, duh: kody szesnastkowe znaków są konwertowane przez parser frontonu (C #, JavaScript lub dowolnego używanego języka) na rzeczywisty znak. Zatem używanie kodów szesnastkowych jest takie samo, jak używanie rzeczywistych znaków, jeśli chodzi o wartość ciągu.
Konrad Rudolph

1
@Pshemo Oczywiście, głupi błąd. Odnośnie interpretacji w [a-c-e]: jest to po prostu nieprawidłowe w niektórych specyfikacjach / silnikach regex. Na przykład POSIX regex nie zezwala na to.
Konrad Rudolph

13

Mniej zagmatwane jest używanie zawsze znaku ucieczki, aby nie musiał on być zależny od pozycji. To jest \-wewnątrz klasy znaków w nawiasach.

Ale jest coś innego do rozważenia. Niektóre z wymienionych znaków powinny być prawdopodobnie zapisane inaczej. W pewnych okolicznościach zdecydowanie powinni.

To porównanie odmian wyrażeń regularnych mówi, że C♯ może używać niektórych prostszych właściwości Unicode. Jeśli masz do czynienia z Unicode, prawdopodobnie powinieneś użyć ogólnej kategorii \p{L}dla wszystkich możliwych liter i być może \p{Nd} dla liczb dziesiętnych. Ponadto, jeśli chcesz uwzględnić wszystkie znaki interpunkcyjne myślnika, a nie tylko ŁĄCZNIK-MINUS, powinieneś użyć tej \p{Pd}właściwości. Możesz również napisać tę sekwencję białych znaków po prostu jako \s, zakładając, że nie jest to dla ciebie zbyt ogólne.

Wszystko razem wygląda tak, że pasuje [\p{L}\p{Nd}\p{Pd}!$*]do dowolnego znaku z tego zestawu.

Prawdopodobnie i tak bym tego użył, nawet gdybym nie planował zajmować się pełnym zestawem Unicode, ponieważ jest to dobry nawyk i ponieważ te rzeczy często wykraczają poza ich oryginalne parametry. Teraz, gdy podniesiesz go do użycia w innym kodzie, nadal będzie działał poprawnie. Jeśli na stałe zakodujesz wszystkie znaki, tak się nie stanie.


Zwykle zgadzam się z tą odpowiedzią, im mniej musisz znać, tym bezpieczniejszy jest kod. Przypomina mi to o problemach z priorytetami operatorów: stackoverflow.com/questions/10007140/… , wydaje mi się, że mam w nich nawiasy (automatycznie dodawane przez moje IDE), nie muszę ich wszystkich znać. Ty lub ktoś inny może prędzej czy później zepsuć sprawę. Oczywiście, jeśli dużo pracujesz z wyrażeniami regularnymi w swoich projektach, możesz potrzebować bardziej zaawansowanej wiedzy.
Christophe Roussy,

4

[-a-z0-9] +, [a-z0-9 -] +, [az-0-9] +, a także [az-0-9] + są takie same. Łącznik między dwoma zakresami uważany jest za symbol.A także [a-z0-9 - + ()] + to wyrażenie regularne zezwala na myślnik.


Powinna być jedną z najlepszych odpowiedzi.
Razor's Edge

3

Czy to jest to, czego szukasz?

MatchCollection matches = Regex.Matches(mystring, "-");

1

użyj „\ p {Pd}” bez cudzysłowów, aby dopasować dowolny typ łącznika. Znak „-” to tylko jeden typ łącznika, który również jest znakiem specjalnym w Regex.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.