Wyrażenie regularne: znajdź spacje (tabulatory / spacje), ale nie znaki nowej linii


97

Jak mogę mieć wyrażenie regularne, które sprawdza spacje lub tabulatory, ale nie znaki nowej linii. Próbowałem, \sale okazało się, że testuje również nowe linie.

Używam C # / WPF, ale to nie powinno mieć znaczenia.

Odpowiedzi:


193

Użyj klas postaci: [ \t]


1
Spotkaj się z moim problemem. Zobacz także stackoverflow.com/a/25956935/292060, aby zapoznać się z \hklasą znaków tylko dla perla , ale pokazuje, że istnieje wiele innych białych znaków, na wypadek gdybyś musiał dodać je do listy tutaj.
goodeye

3
dlaczego miałoby być miejsce przed \t?
Ooker

4
@Ooker Aby uchwycić dosłowną przestrzeń
codemonkee

To nie będzie pasować do innych rodzajów przestrzeni, jak wspomniały inne odpowiedzi.
Gus

1
Dlaczego spacja przed \ t?
Catbuilts

36

Wypróbuj ten zestaw znaków:

[ \t]

To pasuje tylko do spacji lub tabulatora.


14

Jak zauważył @ Eiríkr Útlendi, przyjęte rozwiązanie uwzględnia tylko dwa białe znaki: tabulator poziomy (U + 0009) i spację (U + 0020). Nie uwzględnia innych białych znaków, takich jak nierozdzielające spacje (które zdarzają się w tekście, z którym próbuję sobie poradzić). Bardziej kompletna lista białych znaków jest zawarta w Wikipedii, a także w powiązanej odpowiedzi Perla . Proste rozwiązanie C #, które uwzględnia te inne znaki, można zbudować za pomocą odejmowania klas znaków

[\s-[\r\n]]

lub, w tym rozwiązanie Eiríkr Útlendi, otrzymasz

[\s\u3000-[\r\n]]

3

Uwaga: dla osób zajmujących się tekstem CJK (chińskim, japońskim i koreańskim) spacja dwubajtowa (Unicode \u3000) nie jest uwzględniona w \sżadnej implementacji, którą do tej pory wypróbowałem (Perl, .NET, PCRE, Python). Musisz albo normalizować pierwszych strun (takich jak zastępując wszystko \u3000z \u0020), lub będziesz musiał użyć zestawu znaków, który zawiera ten kodowy oprócz cokolwiek innego spacje jesteś kierowania, takich jak [ \t\u3000].

Jeśli używasz Perla lub PCRE, możesz użyć \hskrótu dla poziomych białych znaków , które wydają się obejmować między innymi spację jednobajtową, dwubajtową i tabulator. Zobacz wątek Dopasuj białe znaki, ale nie znaki nowej linii (Perl), aby uzyskać więcej szczegółów.

Jednak ten \hskrót nie został zaimplementowany dla .NET i C #, najlepiej, jak mogłem powiedzieć.


1
Słuszna uwaga. Java \h(wprowadzona w Javie 8) obejmuje \u3000, ale \snie, chyba że ustawisz tryb UNICODE_CHARACTER_CLASS (wprowadzony w Javie 7).
Alan Moore

0

Jeśli chcesz zamienić miejsce, poniższy kod zadziałał dla mnie wC#

Regex.Replace(Line,"\\\s","");

Dla tab

Regex.Replace(Line,"\\\s\\\s","");

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.